Row_number()分区 - 对于重复值

时间:2014-05-30 04:35:03

标签: sql-server

对不起这篇新帖子。我不知道具体如何搜索我的要求。

这是方案,

          **Location Name      Datetime**
          ABC                  2014-05-01 09:15
          ABC                  2014-05-01 09:25
          XYZ                  2014-05-01 09:35
          PQR                  2014-05-01 09:45
          ABC                  2014-05-01 09:55

这些是我的数据,我需要如下结果,

          **Location Name      Datetime**      Row Number
          ABC                  2014-05-01 09:15     1
          ABC                  2014-05-01 09:25     1
          XYZ                  2014-05-01 09:35     2
          PQR                  2014-05-01 09:45     3
          ABC                  2014-05-01 09:55     4

请帮助我。

1 个答案:

答案 0 :(得分:4)

对于SQL Server 2012或更高版本,您可以使用LAG() OVER()将行与前一行进行比较。这允许你只计算最后一行的差异(这里产生0或1取决于是否存在差异);

如果您然后使用SUM() OVER()来添加差异,那么您将得到您想要的内容;

WITH cte AS (
  SELECT [Location Name], [Datetime], 
         CASE WHEN LAG([Location Name]) 
                   OVER (ORDER BY [Datetime]) <> [Location Name] 
         THEN 1 ELSE 0 END rn
  FROM mytable
)
SELECT [Location Name], [Datetime],
       1 + SUM(rn) OVER (ORDER BY [Datetime]) [Row Number]
FROM cte
ORDER BY [Datetime];

An SQLfiddle to test with