我有一个带有日期时间字段(“时间”)和整数字段(“索引”)的表
请参阅查询和下面的图片。我希望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
这是一个孤岛问题。您需要标识相邻行的组。在这种情况下,我认为最简单的方法是行号的不同:
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;
为什么这样做有效,但解释起来有些棘手。如果查看子查询的结果,您将看到两个行号值之间的差异如何识别相同的相邻值。
[此外,您不应该为列使用time
和index
之类的名称,因为这些是SQL中的关键字。我没有在上面的查询中转义名称。我鼓励您为列和表提供不需要转义的名称。