2011-11-08 25 views
1

Group Byで行われた単純なパーティション以外の行の番号付けにRow_Number()を使用できますか?複雑な条件のRow_Number

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 

すなわち:他のすべてのタイプよりも私は(行番号を日付でソートされた)次のように番号を分割したい

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 

これは私の特定のケースであります32および64は一緒に番号が付けられている。タイプ32とタイプ64の番号付けは、他のものを並べ替えるだけで済むのでオプションです。

私が実際にやりたいことは、から、タイプが32と64のすべての行と、日付が最も低い行のみを取り出します。私がこの特定の質問をしているのは、将来、最初の列以上のものを取り出さなければならない可能性があるからです。あなたが別の解決策を持っているなら、私はすべての耳です。

答えて

4

もちろん、複雑なグループ化式を持つように、複雑なパーティショニング式を使用できます。ここでは、あなたの例では、行をランク付けする可能性がどのように一つの可能​​な方法です:

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 
+0

ありがとう、最初のソリューションは、私にとっては魔法のように動作し、あなたが言ったようにもう一つは、いくつかの場合に役立ちます。 – krtek

関連する問題