【发布时间】:2022-01-24 14:10:55
【问题描述】:
是否可以写一个窗口函数,每次分区值变化时进行分区?
例如:
create table test (id int, i int);
insert into test values (1, 1), (2, 0),(3, 0),(4, 1),(5, 1),(6, 1),(7, 0),(8, 0),(9, 1);
select
id,
i,
row_number() over (partition by i order by id asc) rn
from
test
order by
id asc;
会给我以下结果:
id i rn
----------
1 1 1
2 0 1
3 0 2
4 1 2
5 1 3
6 1 4
7 0 3
8 0 4
9 1 5
但是,当i 的值根据我的排序顺序发生更改时,我希望能够再次重新启动计数器,无论它是否已经出现。
例如,期望的结果是这样的:
id i rn
----------
1 1 1
2 0 1
3 0 2
4 1 1
5 1 2
6 1 3
7 0 1
8 0 2
9 1 1
同样的原则也适用于其他窗口函数,例如累积和。
我真的不想为此循环,而且我找不到合适的窗口函数。
谢谢
【问题讨论】:
-
这被称为间隙和孤岛问题。搜索一下方法,你应该会找到你正在寻找的东西。
标签: sql sql-server tsql