根据记录数据更改重置行号

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 组。您可以使用不同的行号来执行此操作。然后,使用grprow_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 行

保存并转到新记录后如何重置表单的格式

sqlite 获取行号并为每个组重置

如何重置周日晚上 11:59(周一开始前的时间)从数据库中获取的记录

Pysparkling 2 从 1 重置 monotonically_increasing_id

使用 jQuery 重置选择框值