ROW_NUMBER 分析ファンクションの使用例
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| カラム名 | 項目名(日本語) | 型(サイズ) |
| USER_ID └ (主キー) | ユーザーID | VARCHAR(10) |
| USER_NAME | 名前 | VARCHAR(20) |
| CREATED_ON | 作成日 | DATE |
テーブルデータ(作成日付の昇順)
| No.*1 | USER_ID | USER_NAME | CREATED_ON |
| 1 | 102 | 緒方 辰夫 | 2005/01/28 |
| 2 | 157 | 大久保 未来 | 2005/01/29 |
| 3 | 112 | 鈴木 有里 | 2005/01/29 |
| 4 | 153 | 大坪 暢子 | 2005/01/29 |
| 5 | 170 | 三好 隆史 | 2005/01/29 |
| 6 | 120 | 江藤 洋匡 | 2005/02/01 |
| 7 | 152 | 堀内 空 | 2005/02/03 |
| 8 | 130 | 氏家 東生 | 2005/02/07 |
| 9 | 122 | 植木 虎之助 | 2005/02/08 |
| 10 | 190 | 小林 遥 | 2005/02/08 |
| 11 | 171 | 川端 若菜 | 2005/02/13 |
| 12 | ... | ... | ... |
| (SI Object Browser 8 で作成した架空の名前リストです) | |||
非決定的になる可能性がある例 (作成日付昇順に 3件づつ取り出す場合での 2回目の取り出し例)
作成日が同一のレコードがある場合には、戻される結果セットが常に一定と限らない。 中間順位で抽出した場合、同じレコードが2度以上取り出されることがあることを意味する。
(レコードの取り出される順番は、統計データの内容、実行計画の内容によっても変動することがある)SELECT USER_ID, USER_NAME, CREATED_ON, LINE_NO FROM ( SELECT USER_ID ,USER_NAME ,CREATED_ON ,ROW_NUMBER() OVER (ORDER BY CREATED_ON) LINE_NO -- ↑ レコードを一意に決定できない FROM USER_MASTER ) WHERE LINE_NO >= 4 AND LINE_NO < 7 ORDER BY CREATED_ON, USER_ID
決定的になる例 (作成日付昇順,ユーザーID昇順に 3件づつ取り出す場合での 2回目の取り出し例))
作成日が同一のレコードがあった場合でも、ユーザーIDは 主キー であるため戻される結果セットが常に一定になる。(決定的)
SELECT USER_ID, USER_NAME, CREATED_ON, LINE_NO FROM ( SELECT USER_ID ,USER_NAME ,CREATED_ON ,ROW_NUMBER() OVER (ORDER BY CREATED_ON, USER_ID) LINE_NO -- ↑ ここが違う FROM USER_MASTER ) WHERE LINE_NO >= 4 AND LINE_NO < 7 ORDER BY CREATED_ON, USER_ID
汎用的に ORDER BY に ROWID を入れるという方法もある。
分析関数を使用するには Oracle 8i エンタープライズ版、または、Oracle 9i スタンダード版以上が必要
サイト統合にともない代替情報の URL は不明
- Oracle 9i Technical Data 主要機能一覧
(oracle.co.jp)