假设有一个客户列表,每个客户都有不同的合同,并且有到期日。对于每个客户,我想选择给定参考日期后第一个到期日的合同。
例如:
桌上合约:
客户 | 合同 | 截止日期 |
---|---|---|
安东尼 | 合同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子句显然是伪代码,我不知道该怎么做。我可以为一个单独的客户做这件事,但我不知道如何同时为所有客户做这件事。
你们非常接近。您需要使用
where
进行预处理,并使用 having
进行后处理。分两步思考:
看起来是这样的:
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