【问题标题】:Get a record position in a group + record count of the group on each record获取组中的记录位置+每条记录上组的记录数
【发布时间】:2012-10-10 22:30:19
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server ranking-functions


    【解决方案1】:

    你可以使用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

    请注意,由于您没有告诉如何订购,因此未订购。

    【讨论】:

    • 太棒了!并且不需要使用 CTE,我只是将 COUNT(GroupID) OVER (PARTITION BY GroupID) 部分和 RANK 部分添加到一个简单的选择中,效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2023-03-10
    • 2016-11-26
    • 2021-05-05
    • 2022-12-07
    相关资源
    最近更新 更多