样本:
id value
1 a
1 b
1 c
1 d
1 a
1 b
1 d
1 a
预期结果:
id value outcome
1 a 1
1 b 1
1 c 1
1 d 1
1 a 2
1 b 2
1 d 2
1 a 3
因此,基本的想法是,我需要根据值列对我所拥有的行进行编号——每当它达到"0"时;d";,计数重新开始。不确定我会用哪种窗口功能来实现这一点,所以任何帮助都将不胜感激!提前感谢!
使用按value
或按id
和value
分区的row_number
窗口函数(基于所需输出):
-- sample data
with dataset(id, value) as(
values (1, 'a'),
(1, 'b'),
(1, 'c'),
(1, 'd'),
(1, 'a'),
(1, 'b'),
(1, 'd'),
(1, 'a')
)
-- query
select *,
row_number() over (partition by id, value) -- or (partition by value)
from dataset;
注意,如果没有允许";天然的";对于over
子句(即over (partition by id, value order by some_column_like_timestamp)
)的排序,则不能保证查询之间的实际顺序(如果在同一分区中存在具有不同值的其他列,则可以观察到它)。
使用row_number
给它们一个唯一的数字,然后按row_number和value排序。
select
*,
row_number() over ( partition by (val) ) as rn
from stuff
order by rn, val;
演示