Firebird2.5ではROW_NUMBER()関数は使用できないようです。
# データベースのバージョンと関数の対応を調べたすばらしい記事を見つけました。
「指定した範囲の行を取得するクエリ – HHeLiBeXの日記 正道編」
ROW_NUMBER()関数の使えないFirebirdではどうすればいいのかというと、「The Firebird FAQ」でやり方が見つかりました。
■テーブル定義とサンプルデータ
CREATE TABLE classmate (
name VARCHAR(10),
score INTEGER
);
INSERT INTO classmate(name,score) VALUES ('野比 のび太', 20);
INSERT INTO classmate(name,score) VALUES ('源 静香', 80);
INSERT INTO classmate(name,score) VALUES ('骨川 スネ夫', 60);
INSERT INTO classmate(name,score) VALUES ('剛田 武', 40);
INSERT INTO classmate(name,score) VALUES ('出木杉 英才', 100);
■scoreの高い順に連番を振るSQL
SELECT
rdb$get_context('USER_TRANSACTION', 'row#') AS RANKING,
rdb$set_context('USER_TRANSACTION', 'row#', COALESCE(CAST(rdb$get_context('USER_TRANSACTION', 'row#') AS INTEGER), 0) + 1),
name,
score
FROM classmate
ORDER BY score DESC
■実行結果
RANKING | RDB$SET_CONTEXT | NAME | SCORE |
---|---|---|---|
1 | 0 | 出木杉 英才 | 100 |
2 | 1 | 源 静香 | 80 |
3 | 1 | 骨川 スネ夫 | 60 |
4 | 1 | 剛田 武 | 40 |
5 | 1 | 野比 のび太 | 20 |
このSQLを次に実行する時は、行番号をリセットする必要があります。
select rdb$set_context('USER_TRANSACTION', 'row#', 0) from rdb$database;
Pingback: Firebirdで問い合わせの結果に連番を振る(2) « 山本隆の開発日誌