oracle中rownumとrow_number()


row_number()over(partition by col 1 order by col 2)は、col 1パケットに従ってパケット内部でcol 2に従って並べ替えられ、この関数で計算された値は、各グループの内部並べ替え後の順序番号(グループ内で連続する一意)を表しています。rownumとの違いは、rownumを使って並べ替えをするときは、結果集に偽のrownumを入れて並べ替えることです。number()は、並べ替えの後に並べ替えて行番号を計算します。
一、oracle中rownum
クエリーから返される行の番号は、1番目の行に割り当てられ、2番目の行には2が割り当てられており、この疑似フィールドは、クエリーから返される行の合計数を制限するために使用されてもよく、また、rownumは、任意のテーブルの名前でプレフィックスとして使用されてもよい。
1、rownumはある値に等しい照会条件について
学生表の第一条学生の情報を見つけたいなら、rownum=1を条件として使用することができます。しかし、学生表の第二条学生の情報を見つけたいです。rownum=2を使って、データが見つかりません。rownumはすべて1から始まりますが、1以上の自然数はrownumでやるのは全てfalseの条件だと判断しますので、rownum=n(n>1の自然数は調べられません。
SQL>select rownum、id、name from student where rownum=1;   --記録がある
SQL>select rownum、id、name from student where rownum=2;  --記録なし
2、rownumはある値より大きい照会条件について
2行目以降の記録を見つけたいなら、rownum 2を使うと記録が確認できないので、以下のサブクエリ方法で解決できます。サブクエリのrownumには別名が必要です。でなければ記録は検出されません。これはrownumはどの表の列ではないので、別名が起きないと、rownumがサブクエリの列かそれともメインクエリの列かは分かりません。
SQL>select*from(select rownum no,id,name from student)where no>2  --記録がある
SQL>select*from(select rownum,id,name from student)where rownum>2;--記録なし
3、rownumはある値より小さい照会条件について
第三条の記録以前の記録を見つけたいなら、rownumを使って<3は二つの記録を得ることができます。明らかにrownumはrownum<n(n)1の自然数)の条件が成立していると考えられていますので、記録を見つけることができます。
SQL>select rownum、id、name from student where rownum<3;  --記録がある
4、rownumと並び替え
Oracleのrownumはデータを取る際に発生する番号ですので、指定された順序のデータを指定するrowmun行のデータには注意が必要です。
SQL>select rownum,id,name from student order by name;
    ROWNUM ID     NAME
-----------------------------------
         3万003李三です
         2 200002王二
         1万2000枚
         4万04趙四
rownumはname列で生成された番号ではないことが分かります。システムは記録挿入時の順番に記録列の番号を付けます。rowidも順番に割り当てられます。この問題を解決するためには、サブクエリを使用しなければなりません。
SQL>select rownum、id、name from(select*from student order by name);
    ROWNUM ID     NAME
-----------------------------------
         1万2000李三
         2 200002王二
         3 200001張一
         4万04趙四
二、oracle中row_number()
1、row_number()over(order by col_1[、col_]2…)
colによる1[、col_]2...]並べ替えを行い、並べ替えられた結果セットを返し、行ごとに異なる値を返します。
2、row_number()over(partition by col_n[COl_]m…]order by col_1[、col_]2…)
まずコールに従いますn[COl_]m…をグループ化し、各グループにcol_1[、col_]2…]並べ替え(昇順)を行い、最後に並べられた結果セットを返します。
oracle中row_number()の例
1.ロウウウを使うnumber()関数で番号を付けます。
select email,customerID,ROW_NUMBER()over(order by pspd)as rows from QT_Customer
原理:まずpspdによって並べ替えて、並べ替え終わった後に、すべてのデータに番号を付けます。
2.注文書の中で価格の上昇順に並べ替えて、記録ごとに並べ替えコードは以下の通りです。
select DID,customerID,total Price,ROW_NUMBER()over(order by total Price)as rows from OP_Order
3、各取引先の最近の注文を統計するのは何回目の注文ですか?
with tabs as 

select ROW_NUMBER()over(partition by customerID  order by total Price)as rows、customerID、total Price、DID from OP_Order 

select MAX(rows)as'注文回数'customerID from tabs group by customerID
4、overなどの窓開け関数を使用する場合、overの中のグループと順序付けの実行は「where,group by,order by」より遅いです。
プロジェクト  
ROW_NUMBER()over(partition by customerID  order by insDT)as rows, 
customerID、totalPrice、DID 
from OP_Order where insDT>'2011-07-22'
以上のコードはまずwhere子文を実行し、実行後、各レコードに番号を付けます。
三、row_number()とrownumの違い
rownumを使って並べ替えをする時は、結果集に偽造rownumを入れてから並べ替えます。number()は、並べ替えの後に並べ替えて行番号を計算します。
以上述べましたが、本文の内容は全部です。お好きになってください。