2011-11-08 79 views
1

是否可以使用Row_Number()對除Group By之後的簡單分區以外的其他行進行編號?具有複雜條件的Row_Number

這是我的具體情況:

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的編號是可選的,因爲我只需要對其他編號進行排序。

我真正想要做的,是檢索所有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