如何使用Row_Number对结果集进行分组

时间:2013-12-09 19:30:37

标签: sql-server group-by row-number

我坚持使用查询,我不想使用while循环或其他讨厌的方法来执行此操作。

情况如下:

我有一个获取一些数据的查询,我需要根据其他两列来计算一列。

我的结果如下: 输入|客户|循环|金额|到期| Row_Number(按客户划分,循环)

所以,我的row_number列需要“分组”客户和周期,这里是Fiddle以更好地理解它

这是一个例子: My actual results

正如您所看到的,只要我知道row_number的作用,就会正确应用迭代列。 但我需要这样做: How i need my data

有没有办法用Row_Number做到这一点?

或者我是否需要将数据存储在临时表中,循环并更新此ITERATION列?

也许是CTE? 任何有关这方面的帮助将受到高度赞赏。谢谢!

2 个答案:

答案 0 :(得分:4)

只需将其作为新查询运行,替换查询中所需的内容...

WITH T(StyleID, ID)
     AS (SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,1 UNION ALL
         SELECT 1,2)
SELECT *,
      RANK() OVER(PARTITION BY StyleID ORDER BY ID)       AS 'RANK',
      ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
       DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM   T  

的问候,
的Valentin

答案 1 :(得分:2)

您可以使用DENSE_RANK功能代替ROW_NUMBER。

DECLARE @MyTable TABLE
(
    Customer NVARCHAR(100) NOT NULL,
    [Cycle] SMALLINT NOT NULL
);
INSERT @MyTable VALUES ('C1', 2010);
INSERT @MyTable VALUES ('C1', 2010);
INSERT @MyTable VALUES ('C1', 2011);
INSERT @MyTable VALUES ('C1', 2012);
INSERT @MyTable VALUES ('C1', 2012);
INSERT @MyTable VALUES ('C1', 2012);
INSERT @MyTable VALUES ('C2', 2010);
INSERT @MyTable VALUES ('C2', 2010);

SELECT  t.Customer, t.[Cycle], 
        DENSE_RANK() OVER(PARTITION BY t.Customer ORDER BY t.[Cycle]) AS Rnk
FROM    @MyTable t
ORDER BY Customer, [Cycle];

结果:

Customer Cycle  Rnk
-------- ------ ---
C1       2010   1
C1       2010   1
C1       2011   2
C1       2012   3
C1       2012   3
C1       2012   3
C2       2010   1
C2       2010   1

SQL Fiddle