【问题标题】:Write an SQL code to find the projects belonging to a single Epic编写 SQL 代码以查找属于单个 Epic 的项目
【发布时间】:2021-03-23 12:23:14
【问题描述】:

我们有一个包含以下数据的项目表:

project_id start_date end_date
101 2020-01-01 2020-01-05
102 2020-01-06 2020-01-08
103 2020-01-09 2020-01-13
104 2020-01-16 2020-01-17
105 2020-01-18 2020-01-20
106 2020-01-24 2020-01-28
107 2020-01-29 2020-01-30

如果下一个项目的 start_date 比上一个项目的结束日期晚 1 天,则一组特定的项目属于一个共同的史诗。例如,101,102 和 103 属于单个史诗,因为 102 的 start_date 是 2020-01-06,即 101 的 end_date 2020-01-05 后 1 天。同样,103 的 start_date 是 2020-01-09,也就是 102 的 end_date 2020-01-08 后 1 天

必须得到如下结果表

epic projects start_date end_date
1 101;102;103 2020-01-01 2020-01-13
2 104;105 2020-01-16 2020-01-20
3 106;107 2020-01-24 2020-01-30

不知何故,我觉得这是一个差距和孤岛问题,但我无法将它们隔离开来。感谢您的帮助!

【问题讨论】:

  • 我删除了不一致的数据库标签。请仅使用您正在使用的数据库进行标记。
  • 假设您有 3 个项目。第一次在 2020 年 12 月 31 日结束,第二次和第三次在 2021 年 1 月 1 日开始。什么是史诗 - 1,2 或 1,3?为什么?

标签: sql


【解决方案1】:

如果下一个项目的 start_date 比上一个项目的结束日期晚 1 天,则一组特定的项目属于一个共同的史诗。

您可以使用lag() 和累积总和。以下使用 SQL Server 语法:

select epic,
       string_agg(project_id, ',') within group (order by project_id) as project_ids,
       min(start_date), max(end_date)
from (select p.*,
             sum(case when prev_end_date is null or prev_end_date = dateadd(day, -1, start_date
                      then 0 else 1
                 end) over (order by start_date) as epic
      from (select p.*,
                   lag(end_date) over (order by start_date) as prev_end_date
            from projects p
           ) p
     ) p
group by epic
order by epic;

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2022-01-18
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多