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;
我希望计数仅在该值之前未显示时加一。基数 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;