根据记录数据更改重置行号
Posted
技术标签:
【中文标题】根据记录数据更改重置行号【英文标题】:Resetting Row number according to record data change 【发布时间】:2014-12-28 21:59:58 【问题描述】:我得到的数据集如下
name date
x 2014-01-01
x 2014-01-02
y 2014-01-03
x 2014-01-04
我正在努力得到这个结果
name date row_num
x 2014-01-01 1
x 2014-01-02 2
y 2014-01-03 1
x 2014-01-04 1
我已尝试运行此查询
select name,
date,
row_number () over (partition by name order by date) as row_num
from myTBL
但不幸的是我得到了这个结果
name date row_num
x 2014-01-01 1
x 2014-01-02 2
y 2014-01-03 1
x 2014-01-04 3
请帮忙。
【问题讨论】:
哪个数据库 - sql server, oracle 等?以这种方式分配行号的逻辑是什么?你最后想做什么? 您的partition by
声明说分区仅基于name
。你得到的结果就是你要求的结果。您似乎想要的结果是每次 run name
更改时分区都会重置。我不认为你可以用一个简单的窗口函数来做到这一点。您需要一到两级子查询。
对于未来的提问者,这属于称为gaps-and-islands 的问题类别。
【参考方案1】:
您需要识别同时出现的names
组。您可以使用不同的行号来执行此操作。然后,使用grp
对row_number()
进行分区:
select name, date,
row_number() over (partition by name, grp order by date) as row_num
from (select t.*,
(row_number() over (order by date) -
row_number() over (partition by name order by date)
) as grp
from myTBL t
) t
对于您的示例数据:
name date 1st row_number 2nd Grp
x 2014-01-01 1 1 0
x 2014-01-02 2 2 0
y 2014-01-03 3 1 2
x 2014-01-04 4 3 1
这应该让您了解它的工作原理。
【讨论】:
这是一个非常有用的解决方案,因为它应该适用于任何支持ROW_NUMBER()
(大多数)+1 的数据库。
谢谢,这对我的情况也很有帮助以上是关于根据记录数据更改重置行号的主要内容,如果未能解决你的问题,请参考以下文章
将重置计数器(在列的值更改时重置)添加到视图中的 PLSQL 行
如何重置周日晚上 11:59(周一开始前的时间)从数据库中获取的记录