SAS proc sql:为每个值选择正确的间隔

问题描述 投票:0回答:1

假设有一个客户列表,每个客户都有不同的合同,并且有到期日。对于每个客户,我想选择给定参考日期后第一个到期日的合同。

例如:

桌上合约:

客户 合同 截止日期
安东尼 合同A1 2023/03/05
安东尼 合同A2 2024/03/05
安东尼 合同A3 2025/03/05
巴特 合同B1 2024/05/01
巴特 合同B2 2024/08/01
巴特 合同B3 2024/11/01
巴特 合同B4 2024/05/01
卡拉 合同C1 2023/10/03
卡拉 合同C2 2024/10/03

今天是 2024/08/19,所以我想为每个客户选择 1 个在今天之后首先到期的合同。 所以我想要的是

客户 合同
安东尼 合同A3
巴特 合同B3
卡拉 合同C2

我想做的是

proc sql;
create table DueContracts as (
select Client
       , contract 
from contracts
where due_date = min (due dates that are larger than *reference date*)
)
;quit;

where子句显然是伪代码,我不知道该怎么做。我可以为一个单独的客户做这件事,但我不知道如何同时为所有客户做这件事。

sql sas where-clause sql-order-by
1个回答
0
投票

你们非常接近。您需要使用

where
进行预处理,并使用
having
进行后处理。分两步思考:

  1. 获取所有>今天的截止日期
  2. 对于每个截止日期 > 今天的客户,获取这些日期中的最短日期

看起来是这样的:

proc sql;
    create table DueContracts as
        select Client, Contract 
        from contracts
        where due_date > today()
        group by client
        having due_date = min(due_date)
    ;
quit;
Client  Contract
Anthony Contract A3
Bart    Contract B3
Carla   Contract C2
© www.soinside.com 2019 - 2024. All rights reserved.