2

我在 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
4

1 回答 1

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 子句 (Transact-SQL)

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

请注意,它没有订购,因为您还没有告诉如何订购。

于 2012-10-10T22:37:08.547 回答