问题描述
customer product status surrender_date
-------------------------------------------
A a invalid 2020/8/1
A b invalid 2020/9/1
A c valid null
B a invalid 2020/7/1
B b valid null
B c valid null
首先,我想按客户分组:
customer product status surrender_date
-------------------------------------------
A a invalid 2020/8/1
A b invalid 2020/9/1
A c valid null
第二,rank
将通过引用其surrender_date
和status
添加,日期越新,排名越高。
另一方面,如果status = valid
,排名将始终为1
。
customer product status surrender_date rank
--------------------------------------------------
A a invalid 2020/8/1 3
A b invalid 2020/9/1 2
A c valid null 1
因此,我想要的结果如下:
customer product status surrender_date rank
--------------------------------------------------
A a invalid 2020/8/1 3
A b invalid 2020/9/1 2
A c valid null 1
B a invalid 2020/7/1 3
B b valid null 1
B c valid null 1
我的尝试不能包含valid
状态。
select
t.*,rank() over(partition by customer order by surrender_date desc) rank
from
mytable
如果有人有意见,请告诉我。
谢谢
解决方法
请考虑向窗口函数的order by
子句添加另一个条件,该子句将“有效”状态放在第一位:
select
t.*,rank() over(
partition by customer
order by case when status = 'valid' then 0 else 1 end,surrender_date desc
) rn
from mytable