4

Row_Number()で行われる単純なパーティション以外の何かで行に番号を付けるために使用することは可能Group Byですか?

これは私の特定のケースです:

Id    Type    Date
--    ----    ----
 1      16    Some Date
 2      16    Some Date   
 3      16    Some Date
 4      32    Some Date
 5      64    Some Date
 6      64    Some Date
 7     128    Some Date
 8     256    Some Date
 9     256    Some Date
10     256    Some Date

次のように番号を分割したい(行の番号は日付でソートされています):

Id    Type    RowNb
--    ----    -----
 6      64        1
 4      32        2
 5      64        3
 9     256        1
 3      16        2
 1      16        3
 8     256        4
 7     128        5
 2      16        6
10     256        7

すなわち:32と64以外のすべてのタイプは一緒に番号が付けられます。タイプ32と64の番号付けは、他の1つだけを並べ替える必要があるため、オプションです。

私が本当にやりたいのは、タイプ32と64のすべての行と、他のタイプから日付が最も低い行のみを取得することです。この特定の質問をする理由は、将来、最初の列だけでなくそれ以上を取得しなければならない可能性があるためです。そのように行に番号を付けることができれば、より簡単になると思います。あなたが別の解決策を持っているなら、私はすべての耳です。

4

1 に答える 1

7

もちろん、複雑なグループ化式を持つことができるのと同じように、複雑なパーティショニング式を持つことができます。例で行をランク付けする方法の 1 つを次に示します。

SELECT
  Id,
  Type,
  ROW_NUMBER() OVER (
    PARTITION BY CASE WHEN Type IN (32, 64) THEN 1 ELSE 2 END
    Order BY Date
  )
FROM atable

ただし、表示する行をフィルタリングするときに、後でその条件を繰り返す必要があります。だから、もし私があなたなら、次のようなことを試すかもしれません:

WITH marked AS (
  SELECT
    *,
    TypeGroup = CASE WHEN Type IN (32, 64) THEN 1 ELSE 2 END
  FROM atable
),
ranked AS (
  SELECT
    *,
    RowNb = ROW_NUMBER() OVER (PARTITION BY TypeGroup ORDER BY Date)
  FROM
)
SELECT
  Id,
  Type,
  RowNb
FROM ranked
WHERE TypeGroup = 1 OR RowNb = 1
ORDER BY TypeGroup, RowNb
于 2011-11-08T18:46:00.167 に答える