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仅在值与所有先前值不同时获取行号的主要内容,如果未能解决你的问题,请参考以下文章