带条件的 Oracle rank()

Oracle rank() with conditions

我想调查客户在购买第一个产品后购买第二个产品且没有拖欠的行为(他们向我们借钱购买手机)。

我的主管建议创建一个 table 喜欢

Client_id  Contract_date  Contract_id  no_days_pd Rank
1          01-Jan-2015    123          (null)     1
1          01-May-2015    456          don't care 2
1          01-Aug-2015    789          don't care 3

并仅检查 rank = 2 的合同。在此table中,no_days_pd表示逾期天数,null表示在所有分期付款期间均未拖欠。

我可以在 Oracle 中使用 rank() 函数来执行此操作吗?我怎样才能对排名施加一些条件,比如

when product = 'Mobile' and no_days_pd is null then rank = 1

我不知道如何让它继续排名 = 2、3...我想 order by Contract_date 确保排名 2 的合同在第一份合同之后没有拖欠。

非常感谢!!

试试这个:

已编辑以检查上一份合同的days_past_due

with thetable as (
select 1 client_id,      to_date('01-Jan-2015','dd-mon-yyyy')  contract_Date,  123  contract_id ,  null days_past_due from dual union
select 1 client_id,      to_date('01-May-2015','dd-mon-yyyy')  contract_Date,  456  contract_id ,  12 days_past_due from dual union
select 1 client_id,      to_date('01-Aug-2015','dd-mon-yyyy')  contract_Date,  789  contract_id ,  99 days_past_due from dual union
-- add client 2 which shouldn't appear as first contract is past due
select 2 client_id,      to_date('01-Jan-2015','dd-mon-yyyy')  contract_Date,  444  contract_id ,  31 days_past_due from dual union
select 2 client_id,      to_date('01-May-2015','dd-mon-yyyy')  contract_Date,  555  contract_id ,  1 days_past_due from dual 
)
    SELECT * from (
        select client_id
             , contract_date
             , contract_id
             , days_past_due
             , row_number() over (partition by client_id order by contract_Date asc) contract_rank
             , lag(days_past_due) over (partition by client_id order by contract_date) prev_contract_past_due
        from thetable 
    ) 
    where contract_Rank = 2 and prev_contract_past_due is null