MSSQL:为什么ROW_NUMBER不能给我预期的结果?

问题描述 投票:1回答:1

我有一个带有日期时间字段(“时间”)和整数字段(“索引”)的表

请参阅查询和下面的图片。我希望ROW_NUMBER在索引更改时也从1开始计数,如果索引值在前几行中也是如此。红色文本表示我想从查询中获得的输出。如何修改查询以提供预期的结果?

]

查询:

select rv.[time], rv.[index], ROW_NUMBER() OVER(PARTITION BY rv.[index] ORDER BY  rv.[time],  rv.[index] ASC) AS Row# 
from 
tbl
sql sql-server window-functions row-number
1个回答
5
投票

这是一个孤岛问题。您需要标识相邻行的组。在这种情况下,我认为最简单的方法是行号的不同:

select rv.*,
       row_number() over (partition by index, (seqnum - seqnum_2) order by time) as row_num
from (select t.*,
             row_number() over (order by time) as seqnum,
             row_number() over (partition by index order by time) as seqnum_2
      from tbl t
     ) rv;

为什么这样做有效,但解释起来有些棘手。如果查看子查询的结果,您将看到两个行号值之间的差异如何识别相同的相邻值。

[此外,您不应该为列使用timeindex之类的名称,因为这些是SQL中的关键字。我没有在上面的查询中转义名称。我鼓励您为列和表提供不需要转义的名称。

© www.soinside.com 2019 - 2024. All rights reserved.