Firebirdで問い合わせの結果に連番を振る

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;

コメント

  1. Pingback: Firebirdで問い合わせの結果に連番を振る(2) « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください