SQL仅在值与所有先前值不同时获取行号

Posted

技术标签:

【中文标题】SQL仅在值与所有先前值不同时获取行号【英文标题】:SQL Getting row number only when the value is different from all previous values 【发布时间】:2021-01-12 01:52:39 【问题描述】:

我希望计数仅在之前未显示该值时加一。基表是:

rownum product   
 1      coke  
 2      coke
 3      burger
 4      burger
 5      chocolate
 6      apple
 7      coke
 8      burger

目标是:

 rownum product   
 1      coke  
 1      coke
 2      burger
 2      burger
 3      chocolate
 4      apple
 4      coke
 4      burger

我正在考虑将当前行与之前的所有行进行比较,但我很难调用所有之前的行。谢谢!

【问题讨论】:

行必须按照确切的顺序出现吗? 您已经接受了我的回答。但我意识到我的输出符合您对问题的描述,而不是上面列出的“目标输出”。 这里是比较两个答案的简单地方:rextester.com/WDJO97885 【参考方案1】:

有几种不同的方法来实现这一点。我想你会选择一个你最喜欢的。这个只是找到每个产品的第一行号。然后,您只需将dense_rank() 轻松应用到初始分组即可折叠这些孔。

with data as (
   select *, min(rownum) over (partition by product) as minrow
   from T
)
select dense_rank() over (order by minrow) as rownum, product
from data
order by rownum, data.rownum;

【讨论】:

【参考方案2】:

这是一个孤岛问题。这是使用窗口函数的一种方法:想法是使用窗口总和,每次看到产品的“第一次”出现时都会增加:

select t.*, 
    sum(case when rn = 1 then 1 else 0 end) over(order by rownum) new_rownum
from(
    select t.*, row_number() over(partition by product order by rownum) rn
    from mytable t
) t
order by rownum

【讨论】:

谢谢,真的很有帮助!

以上是关于SQL仅在值与所有先前值不同时获取行号的主要内容,如果未能解决你的问题,请参考以下文章

如何将列的当前值与sql server和Oracle中同一列的先前值进行比较

合并 - 仅在值更改时更新

Oracle Where 案例

仅在值更改时触发线程(python)

整数包装对象仅在值 127 内共享相同的实例? [复制]

T-SQL:如何在值列表中选择不在表中的值?