获取每个记录中组的记录位置+组的记录数

Ale*_* B. 2 sql sql-server ranking-functions

我在SQL Server 2008上的临时表中有一个结果集.其中一个字段是组ID,对于每个组,我可以有任意数量的行.我想在一个新列中获取组中行的位置,例如"第1行的第3行"所以,如果我有临时表#Data(GroupId int,Item char),

GroupId  Item
-------------
   5      C
   5      A
   5      T
   2      U
   3      Y
   3      L
Run Code Online (Sandbox Code Playgroud)

我想得到

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
Run Code Online (Sandbox Code Playgroud)

我设法做到了这一点

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
Run Code Online (Sandbox Code Playgroud)

但是我对此不太满意,因为查询实际上有点复杂,因为我实际上必须检索所有列,并且因为同时执行内部连接以获取组行计数和分区以获取行位置似乎太多了.有更简单的方法吗?


我没有完全使用Tim的答案,但它向我展示了方式:

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
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 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
Run Code Online (Sandbox Code Playgroud)

OVER子句(Transact-SQL)

这是一个小提琴:http://sqlfiddle.com/#!6/ b6505/2/0

请注意,由于您尚未告知如何订购,因此未订购.