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