问题描述
给出以下原始数据,如何将它们分组以在所需的输出中具有rank字段: 内置的density_rank和rank函数在这里似乎不起作用,因为它们最终总是将Type B分组在一起,而不是将它们分成2个等级。请指教!
原始数据:
ID Type Year
1 A 1998
2 B 1999
3 B 2000
4 C 2001
5 B 2002
6 B 2004
7 B 2020
所需的输出:
ID Type Year Rank
1 A 1998 1
2 B 1999 2
3 B 2000 2
4 C 2001 3
5 B 2002 4
6 B 2004 4
7 B 2020 4
解决方法
使用lag()
查看先前的值,然后使用累积总和来计算值的变化:
select t.*,sum(case when type = prev_type then 0 else 1 end) over (order by id) as rank
from (select t.*,lag(type) over (order by id) as prev_type
from t
) t;