我正在寻求帮助,以获得位于不同行的两个日期之间差异的运行总和。
表看起来像:
client_id | 姓名 | autopay_status | 合同编号 | 开始日期 | 结束日期 |
---|---|---|---|---|---|
1 | 合同一 | 不活跃 | 1111 | “2019-08-30” | “2020-02-29” |
1 | 合同一 | 不活跃 | 1112 | “2020-02-29” | “2020-08-29” |
1 | 合同一 | 积极的 | 1113 | “2020-08-29” | “2021-02-28” |
2 | 合同 2 | 不活跃 | 2221 | “2019-08-30” | “2020-02-29” |
2 | 合同 2 | 不活跃 | 2222 | “2020-02-29” | “2020-08-29” |
2 | 合同 2 | 积极的 | 2223 | “2020-08-29” | “2021-02-28” |
3 | 合同 3 | 不活跃 | 3331 | “2019-08-30” | “2020-02-29” |
3 | 合同 3 | 不活跃 | 3332 | “2020-03-29” | “2020-09-29” |
3 | 合同 3 | 不活跃 | 3333 | “2020-09-29” | “2021-03-28” |
3 | 合同 3 | 积极的 | 3334 | “2021-03-28” | “2021-09-28” |
我有一个查询,查看前一个 end_date,如果它在一天之内,那么这是一份持续合同。
SELECT
case when
(start_date - coalesce(lag(end_date) over (partition by client_id order by end_date), end_date)::date)::int <= 1 then true
else false
end as continous_contract,
end_date - start_date as contract_days,
client_id,
contract_id,
autopay_status,
start_date,
end_date
FROM
client_contracts
ORDER BY
client_id, start_date
这增加了两个额外的别名列。
连续合同 | 合同天数 | client_id | 姓名 | autopay_status | 合同编号 | 开始日期 | 结束日期 |
---|---|---|---|---|---|---|---|
真的 | 183 | 3 | 合同 3 | 不活跃 | 3331 | “2019-08-30” | “2020-02-29” |
错误的 | 184 | 3 | 合同 3 | 不活跃 | 3332 | “2020-03-29” | “2020-09-29” |
真的 | 183 | 3 | 合同 3 | 不活跃 | 3333 | “2020-09-29” | “2021-03-28” |
真的 | 182 | 3 | 合同 3 | 积极的 | 3334 | “2021-03-28” | “2021-09-28” |
我的目标是总结客户拥有连续合同的天数,因此上述示例的表格如下所示:
sum_days | 连续合同 | 合同天数 | client_id |
---|---|---|---|
183 | 真的 | 183 | 3 |
184 | 错误的 | 184 | 3 |
367 | 真的 | 183 | 3 |
549 | 真的 | 182 | 3 |
733 | 真的 | 184 | 3 |
181 | 错误的 | 181 | 3 |
我将下面的查询放在一起,但它只总结了前两个值。
SELECT
*
FROM
(
SELECT
*,
case
when cc.continuous_contract = true then
cc.contract_days + coalesce(lag(cc.contract_days) over (partition by cc.client_id), 1)
else cc.contract_days
end as added_contract_days
FROM (
SELECT
case when
(start_date - coalesce(lag(end_date) over (partition by client_id order by end_date), end_date)::date)::int <= 1 then true
else false
end as continuous_contract,
end_date - start_date as contract_days,
client_id,
contract_id,
autopay_status,
start_date,
end_date
FROM
client_contracts
) as cc
) as ccc
我很高兴改变任何事情来完成这项工作。
Fiddle 用于协助查看数据和结构: Fiddle