我有一个表,如下所示,从中我想得到总剂量的剩余天数:
USER|PURCHASE_DATE|DOSES
1111|2017-07-27|15
2222|2020-07-17|3
3333|2021-02-01|5如果剂量没有过期,并且每个剂量都可以使用90天,那么我使用的SQL是:
SUM(DOSES)*90-DATEDIFF(DAY,MIN(DATE),GETDATE())USER|DAYS_REMAINING
1111|0
2222|6
3333|385但是,如果我想强制每个剂量在一年内到期,该怎么办?如何修改我的SQL以获得以下所需的答案:
USER|DAYS_REMAINING
1111|-985
2222|6
3333|300它可能涉及到剂量过期时间和持续时间之间的最小值,但我不知道如何在过期逻辑中进行聚合。
发布于 2021-04-08 11:34:24
MIN是您希望LEAST在两个值之间选择的聚合函数:
WITH data(user,purchase_date, doses) AS (
SELECT * FROM VALUES
(1111,'2017-07-27',15),
(2222,'2020-07-17',3),
(3333,'2021-02-01',5)
)
SELECT
d.*,
d.doses * 90 AS doses_duration,
365::number AS year_duration,
least(doses_duration, year_duration) as max_duration,
DATEADD('day', max_duration, d.purchase_date)::date as last_dose_day,
DATEDIFF('day', current_date, last_dose_day) as day_remaining
FROM data AS d
ORDER BY 1;提供:
USER PURCHASE_DATE DOSES DOSES_DURATION YEAR_DURATION MAX_DURATION LAST_DOSE_DAY DAY_REMAINING
1111 2017-07-27 15 1350 365 365 2018-07-27 -986
2222 2020-07-17 3 270 365 270 2021-04-13 5
3333 2021-02-01 5 450 365 365 2022-02-01 299所有这些都可以通过date_diff上的一个小修复程序整合在一起,例如:
WITH data(user,purchase_date, doses) AS (
SELECT * FROM VALUES
(1111,'2017-07-27',15),
(2222,'2020-07-17',3),
(3333,'2021-02-01',5)
)
SELECT
d.user,
DATEDIFF('day', current_date, DATEADD('day', least(d.doses * 90, 365::number), d.purchase_date)::date)+1 as day_remaining
FROM data AS d
ORDER BY 1;给予:
USER DAY_REMAINING
1111 -985
2222 6
3333 300https://stackoverflow.com/questions/66996724
复制相似问题