「Yからランク付けされたX」データを表示できるようにしたいテーブルがあります。特に、個々の行のデータを比較的効率的な方法で(つまり、テーブル内のすべての行を選択せずに)表示できるようにしたいと思います。ランキング自体は非常に単純で、テーブルの1つの列に対する単純なORDERBYです。
Postgresはこの点でいくつかのユニークな課題を提示しているようです。AFAICTには、RANK、ROW_NUMBER、または同等の関数がありません(少なくとも、8.3では、今のところ行き詰まっています)。メーリングリストアーカイブの標準的な答えは、一時的なシーケンスを作成し、そこから選択することのようです。
test=> create temporary sequence tmp_seq;
CREATE SEQUENCE
test=*> select nextval('tmp_seq') as row_number, col1, col2 from foo;
テーブルから1行だけを選択したい場合(ランクではなくPKで選択したい場合)、このソリューションはまだ役に立たないようです。
ランクを非正規化して別の列に格納することで、データの表示を簡単にすることができますが、問題を再配置するだけです。UPDATEはORDERBYをサポートしていないため、ランクを設定するためにUPDATEクエリを作成する方法がわかりません(すべての行を選択し、行ごとに個別のUPDATEを実行する以外は、DBアクティビティが多すぎるようです。ランクの更新が必要になるたびにトリガーします)。
明らかな何かが欠けていますか?これを行う正しい方法は何ですか?
編集:どうやら私は十分に明確ではありませんでした。私はOFFSET/LIMITを知っていますが、それがこの問題の解決にどのように役立つかわかりません。X位のアイテムを選択するのではなく、任意のアイテム(PKなど)を選択して、「312のうち43位」のようなものをユーザーに表示できるようにします。