我在 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
我想得到
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