繁体   English   中英

如何将相关行的值添加到 SQL 中的列

[英]how to add values of related rows to a column in SQL

我有一个包含合同信息的表格,我想添加一个计算列,用于标识合同何时与同一客户的前一个合同连续。 因此,当合同的结束日期与同一客户的下一个合同的开始日期相匹配时,我们认为这是连续的。

数据如下所示:

在此处输入图像描述

我希望它看起来像这样:

在此处输入图像描述

我尝试对其自身进行合同表的内部连接,然后将其合并,但我认为这不是最有效的方法。

你知道实现这一目标的更好方法吗?

提前致谢。

下面的代码在SQL 服务器上进行了测试,但也可以在Presto上运行。 SQL 服务器具有bit值而不是boolean s,因此我将TRUEFALSE作为字符串返回。 希望您能够进行任何必要的修改。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM