我坚持使用查询,我不想使用while循环或其他讨厌的方法来执行此操作。
情况如下:
我有一个获取一些数据的查询,我需要根据其他两列来计算一列。
我的结果如下: 输入|客户|循环|金额|到期| Row_Number(按客户划分,循环)
所以,我的row_number列需要“分组”客户和周期,这里是Fiddle以更好地理解它
这是一个例子:
正如您所看到的,只要我知道row_number的作用,就会正确应用迭代列。 但我需要这样做:
有没有办法用Row_Number做到这一点?
或者我是否需要将数据存储在临时表中,循环并更新此ITERATION列?
也许是CTE? 任何有关这方面的帮助将受到高度赞赏。谢谢!
答案 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