3

別の識別子でグループ化されたMAX(id)のリストを返したい単一のテーブルがあります。ただし、特定の基準を満たすと、その基準を満たさない行を「切り詰める」3番目の列があります。

おそらく例で説明する方が簡単です。サンプルテーブルには次のものがあります。

UniqueId(int)GroupId(int)IsPriority(ビット)

生データ:

UniqueId    GroupId    IsPriority
-----------------------------------
    1           1          F
    2           1          F
    3           1          F
    4           1          F
    5           1          F
    6           2          T
    7           2          T
    8           2          F
    9           2          F
   10           2          F

したがって、groupId 1の行にはIsPriorityが設定されていないため、最高のUniqueId(5)を返します。groupId 2にはIsPriorityが設定された行があるため、その値(7)で最高のUniqueIdを返します。

したがって、出力は次のようになります。

5
7

これをブルートフォースする方法を考えることはできますが、1回のクエリでこれを実行できるかどうかを確認しています。

4

1 に答える 1

7

SQLフィドルデモ

WITH T
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY GroupId 
                                    ORDER BY IsPriority DESC, UniqueId DESC ) AS RN
         FROM   YourTable)
SELECT UniqueId,
       GroupId,
       IsPriority
FROM   T
WHERE  RN = 1 
于 2013-01-04T17:56:57.783 に答える