2016-08-02 63 views
-3

我想根据下面的样品实现行编号:SQL Server行数

StartOfWeek Total RowNumber 
----------------------------- 
1/17/2016 8  1 
1/24/2016 8  1 
1/31/2016 10  2 
2/7/2016 10  2 
2/14/2016 14  3 
2/21/2016 10  4 
2/28/2016 10  4 

我怎样才能做到这一点?我尝试了dense_rank,但似乎无法获得预期的RowNumber。

谢谢!

+5

请编辑您的问题,以显示你已经尝试了什么。此外,你还不完全清楚你想要完成什么。 – mituw16

+1

在@ mituw16的评论中详细阐述,用什么逻辑来计算'RowNumber'并不明显。一个天真的猜测可能是“什么时候,由'StartOfWeek'命令,'Total'的值变化,增加'RowNumber'”请编辑您的问题以包含此信息。 –

+0

RowNumber指的是什么? – jim

回答

0

可以使用CTE为这个和自加入

CREATE TABLE test (
    StartOfWeek DATETIME, 
    Total INT 
    ) 
INSERT INTO test 
VALUES ('1/17/2016',8), 
     ('1/24/2016',8), 
     ('1/31/2016',10), 
     ('2/7/2016',10), 
     ('2/14/2016',14), 
     ('2/21/2016',10), 
     ('2/28/2016',10) 

;WITH cte AS (
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY StartOfWeek) Rn 
    FROM test 
) 
SELECT c1.StartOfWeek, 
     c1.Total, 
     -- incremement by 1 if Total value changes 
     SUM(CASE WHEN c1.Total= c2.Total THEN 0 
       ELSE 1 END) OVER (ORDER BY c1.Rn) AS RowNumber 
FROM cte c1 
     LEFT JOIN cte c2 ON c1.Rn = c2.Rn + 1 

Result 

StartOfWeek    Total  RowNumber 
----------------------- ----------- ----------- 
2016-01-17 00:00:00.000 8   1 
2016-01-24 00:00:00.000 8   1 
2016-01-31 00:00:00.000 10   2 
2016-02-07 00:00:00.000 10   2 
2016-02-14 00:00:00.000 14   3 
2016-02-21 00:00:00.000 10   4 
2016-02-28 00:00:00.000 10   4 
+0

我没有测试这个,但它似乎从零开始 – Paparazzi

+0

太棒了,它的工作原理!谢谢你 –

+0

@LaurenceSurat这CTE是相当矫枉过正,你应该能够用'dense_rank()来完成此操作(按总数排序)' – iamdave