带条件的 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
我想调查客户在购买第一个产品后购买第二个产品且没有拖欠的行为(他们向我们借钱购买手机)。
我的主管建议创建一个 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