Postgresql で、追加の行を破棄せずに制限付きの列に基づいて行をグループ化するクエリを作成する方法はありますか?
id, color, score
次の行を持つ3つの列を持つテーブルがあるとします
1 red 10.0
2 red 7.0
3 red 3.0
4 blue 5.0
5 green 4.0
6 blue 2.0
7 blue 1.0
次のクエリを使用して、ウィンドウ関数を使用して色に基づいてグループ化できます
SELECT * FROM (
SELECT id, color, score, rank()
OVER (PARTITION BY color ORDER BY score DESC)
FROM grouping_test
) AS foo WHERE rank <= 2;
結果とともに
id | color | score | rank
----+-------+-------+------
4 | blue | 5.0 | 1
6 | blue | 2.0 | 2
5 | green | 4.0 | 1
1 | red | 10.0 | 1
2 | red | 7.0 | 2
ランク> 2のアイテムを破棄します。ただし、必要なのは次のような結果です
1 red 10.0
2 red 7.0
4 blue 5.0
6 blue 2.0
5 green 4.0
3 red 3.0
7 blue 1.0
破棄された行はありません。
編集: 必要なロジックについてより正確に言うと:
- スコアが最も高い行を取得します
- 同じ色でスコアが最も高い次の行
- 残りのアイテムの中で最もスコアの高いアイテム
- 2. と同じですが、3. からの行に対して
...
同じ色のペアが見つかるまで続け、残ったものをスコアの降順で並べます。
テスト テーブルのインポート ステートメントは、ここにあります。ご協力いただきありがとうございます。