如何通过引用SQL中的日期和状态进行排名

问题描述

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_datestatus添加,日期越新,排名越高。

另一方面,如果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