2012-10-10 161 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部分添加到一个简单的选择,它工作的很棒! –