【问题标题】:How to convert multiple date rows into a date range of continuous dates?如何将多个日期行转换为连续日期的日期范围?
【发布时间】:2021-07-20 12:35:54
【问题描述】:
id load_date
123 2021-03-01
123 2021-02-01
123 2021-01-01
123 2020-12-31
123 2020-11-13
123 2020-05-14
123 2020-04-16
123 2019-01-16

这些是我想将某个特定成员的日期列表转换为连续日期的日期范围(基于月份和年份)

预期结果:

Member_StartDate Member_TermDate
2019-01-16 2019-01-16
2020-04-16 2020-05-14
2020-11-13 2021-03-01

我想要 mysql5.7 使用 sql qry 的结果 对此的任何帮助将不胜感激。

【问题讨论】:

  • 你怎么知道一个日期是开始日期还是学期日期?
  • 您使用的是 MySQL 还是 MS SQL Server? (答案取决于使用的产品。)
  • 我使用的是 MySQL 5.7 版本。开始日期和学期日期由日期的连续性决定,例如在这种情况下,最短日期是 2019 年 1 月,所以第一个开始日期是 2019 年 1 月,之后没有日期直到 2020 年 4 月,所以第一个结束日期也是 2019 年- 01,下一个开始日期是 2020-04。
  • 任何其他疑问请告诉我。
  • 2020-11-13和2021-03-01配对的时候,2019-01-16怎么不能和2020-04-16配对?

标签: mysql sql mysql-5.7


【解决方案1】:

这是 8.0 中相当直接的分组

select patient_id,  min(load_date) s,  max(load_date) e
from (
   select t.*, 
      sum(seq) over(partition by patient_id order by load_date) grp
   from (
      select *,
         lag(monthstart, 1, DATE_ADD(monthstart, interval -1 month)) over(partition by patient_id order by load_date) <> DATE_ADD(monthstart, interval -1 month) seq
      from (
            select *, DATE_ADD(load_date, interval - day(load_date)+1 day) monthstart
            from events
           )t
       ) t
    )t
group by patient_id, grp
order by patient_id, min(load_date)

将其翻译回 5.7:

select patient_id,  min(load_date) s,  max(load_date) e
from (
     select *, 
        (select sum(seq)
         from(
             select *, 
                not exists(
                   select 1 
                   from events e2
                   where DATE_ADD(t.monthstart, interval -1 month) = DATE_ADD(e2.load_date, interval - day(e2.load_date)+1 day) and t.patient_id = e2.patient_id
                          ) seq
             from (
                  select *, DATE_ADD(load_date, interval - day(load_date)+1 day) monthstart
                  from events
                  ) t
              ) t 
         where t.patient_id = e.patient_id and t.load_date <= e.load_date) grp
     from events e
     ) t
group by patient_id, grp
order by patient_id, min(load_date)

db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2021-04-18
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多