SQL仅当值与以前的所有值不同时才获取行号

SQL仅当值与以前的所有值不同时才获取行号,sql,greatest-n-per-group,window-functions,gaps-and-islands,Sql,Greatest N Per Group,Window Functions,Gaps And Islands,我只希望在以前未显示值时计数加一。基本表是: 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

我只希望在以前未显示值时计数加一。基本表是:

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\u 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;

一定要按那样的顺序排出来吗?你已经接受了我的答案。但我意识到我的输出与您对问题的描述相符,但与上面列出的“目标输出”不符。这里有一个比较这两个答案的简单地方:谢谢,这真的很有帮助!