6

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

破棄された行はありません。

編集: 必要なロジックについてより正確に言うと:

  1. スコアが最も高い行を取得します
  2. 同じ色でスコアが最も高い次の行
  3. 残りのアイテムの中で最もスコアの高いアイテム
  4. 2. と同じですが、3. からの行に対して
    ...

同じ色のペアが見つかるまで続け、残ったものをスコアの降順で並べます。

テスト テーブルのインポート ステートメントは、ここにあります。ご協力いただきありがとうございます。

4

2 に答える 2

3

ネストされた2つのウィンドウ関数を使用して実行できます

SELECT
  id
FROM (
  SELECT
    id,
    color,
    score,
    ((rank() OVER color_window) - 1) / 2 AS rank_window_id
  FROM grouping_test
  WINDOW color_window AS (PARTITION BY color ORDER BY score DESC)
) as foo
WINDOW rank_window AS (PARTITION BY (color, rank_window_id))
ORDER BY
  (max(score) OVER rank_window) DESC,
  color;

2グループサイズのパラメータであること。

于 2013-04-23T14:19:13.583 に答える