繁体   English   中英

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

[英]SQL Getting row number only when the value is different from all previous values

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

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

我想将当前行与所有以前的行进行比较,但我很难调用所有以前的行。 谢谢!

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

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

几种不同的方法来实现这一点。 我想你会选择一个你最喜欢的。 这个只是找到每个产品的第一个行号。 然后,您只需要简单地将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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM