2012-10-10 215 views
2

我在SQL Server 2008的臨時表中有一個結果集。其中一個字段是組ID,對於每個組我可以有任何數字的行。我想在新的一列得到行的位置在一組,如「3 1行」 所以,如果我有臨時表#DATA(INT的GroupId,項目字符)與獲取組中的記錄位置+每條記錄上組的記錄數

GroupId Item 
------------- 
    5  C 
    5  A 
    5  T 
    2  U 
    3  Y 
    3  L 

我想獲得

GroupId Item Pos GroupCount 
---------------------------- 
    5  C 1  3 
    5  A 2  3 
    5  T 3  3 
    2  U 1  1 
    3  Y 1  2 
    3  L 1  2 

我設法做到這一點做

SELECT D.GroupId, D.Item, ROW_NUMBER() OVER (PARTITION BY D.GroupId ORDER BY D.Item) AS Pos, COUNT(1) AS GroupCount 
    FROM #Data D 
     INNER JOIN #Data DC 
GROUP BY D.GroupId, D.Item 

但我不太滿意這一點,因爲查詢其實是因爲所有的有點複雜我實際擁有的專欄檢索,因爲與自己一起進行內部聯接以獲取組行計數和分區以獲取行位置似乎太多了。 有沒有更簡單的方法來做到這一點?


我並沒有完全用添的回答,但它給我的方式:

SELECT D.GroupId, D.Item, 
     ROW_NUMBER() OVER (PARTITION BY D.GroupId ORDER BY D.Item) AS Pos, 
     COUNT(D.GroupId) OVER (PARTITION BY D.GroupId) AS GroupCount 
    FROM #Data D 

回答

6

您可以使用COUNT(GroupID)OVER(PARTITION BY GroupID)

WITH CTE AS 
(
    SELECT GroupId, Item 
    , GroupCount = COUNT(GroupID) OVER (PARTITION BY GroupID) 
    , Pos = ROW_NUMBER() OVER (Partition By GroupID Order By GroupId) 
    FROM #Data 
) 
SELECT GroupID, Item, Pos, GroupCount 
FROM CTE 

OVER Clause (Transact-SQL)

這裏有一個小提琴:http://sqlfiddle.com/#!6/b6505/2/0

請注意,由於您尚未告知如何訂購,因此未訂購。

+0

優秀!並且不需要使用CTE,我只是將'COUNT(GroupID)OVER(PARTITION BY GroupID)'部分和RANK部分添加到一個簡單的選擇,它工作的很棒! –