SQL 仅当值不同于所有先前值时获取行号

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

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

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

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

这是一个 gaps-and-islands 问题。这是使用 window 函数的一种方法:想法是使用 window 总和,每次看到产品的“第一次”出现时该总和都会增加:

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;