[英]how to add values of related rows to a column in SQL
下面的代码在SQL 服务器上进行了测试,但也可以在Presto上运行。 SQL 服务器具有bit
值而不是boolean
s,因此我将TRUE
和FALSE
作为字符串返回。 希望您能够进行任何必要的修改。
SELECT
c.contract_id
,c.client
,c.start_date
,c.end_date
,CASE
WHEN LAG(c.end_date) OVER (PARTITION BY c.client ORDER BY c.start_date) = c.start_date
THEN 'TRUE' ELSE 'FALSE'
END as is_consecutive
,CASE
WHEN LAG(c.end_date) OVER (PARTITION BY c.client ORDER BY c.start_date) = c.start_date
THEN LAG(c.contract_id) OVER (PARTITION BY c.client ORDER BY c.start_date)
END as related_previous
,CASE
WHEN LEAD(c.start_date) OVER (PARTITION BY c.client ORDER BY c.start_date) = c.end_date
THEN LEAD(c.contract_id) OVER (PARTITION BY c.client ORDER BY c.start_date)
END as related_next
FROM
contract c
如果超过 2 个,您的“相关 ids”将是一个挑战。这会变成一个差距和岛屿问题,最好的方法是使用lag()
和累积总和:
select t.*,
coalesce(prev_end_date = end_date, false) as is_consecutive,
array_agg(contract_id) over (partition by clent, grp order by start_date) as contracts
from (select sum(case when prev_end_date = end_date then 0 else 1 end) over (partition by client order by start_date) as grp
from (select t.*,
lag(end_date) over (partition by client order by start_date) as prev_end_date
from t
) t
) t;
注意:这会将所有相关合约放入一个数组中。 如果您愿意,您可以删除当前的合同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.