【问题标题】:Add the continuous date period records into one record with sql用sql将连续日期期间的记录添加到一条记录中
【发布时间】:2021-08-20 04:47:56
【问题描述】:

原始数据:

ID  Date        Original_col
A   2021-04-10    1
B   2021-03-01    1
B   2021-05-01    1
C   2021-03-01    1
C   2021-03-02    2
C   2021-03-03    3
C   2021-05-07    1

结果数据:

ID  Date        Result_col
A   2021-04-10    1
B   2021-03-01    1
B   2021-05-01    1
C   2021-03-01    3
C   2021-05-07    1

对于 ID = 'C' 记录,日期在 '2021-03-01' 到 '2021-03-03' 之间的记录被组合在一起,只有开始日期 '2021-03-01' 和最大天 '3'保留,日期 = '2021-05-07' 的记录会保留,因为没有更大的记录。

“日期期间”没有严格的限制,如果它们在 Original_col 上是连续的,我需要将它们组合在一起。

【问题讨论】:

  • 请通过“sum the same date period”添加一些关于您想要的结果的具体含义。什么日期时间?什么总结?根据 Result 数据,我无法对记录的日期时间段进行正确的关联、猜测 ID 和 Year+Month。例如:GROUP BY ID, DATE_FORMAT("%Y%m", Date),但求和意味着ID, MIN(Date), SUM(Original_col) 将导致C 2021-03-01 6 而不是C 2021-03-01 3,也许是MAX(Original_col)
  • 甚至可能是 SELECT ID, MIN(Date), COUNT(Date) ... GROUP BY ID, YEAR(Date), MONTH(Date),其中 "sum" 被错误地用于代替 count
  • 请注意,按照惯例,术语“ID”通常是为代理主键保留的。
  • 我们是否理解如果最后一行是“2021-03-04”,它仍然会被保留(“因为没有更大的记录”)

标签: mysql sql data-analysis


【解决方案1】:

您可以通过减去一个枚举值来识别周期。这对于“相邻”的日子是恒定的。剩下的只是聚合:

select id, min(date), max(original_col) as result_col
from (select t.*,
             row_number() over (partition by id order by date) as seqnum
      from t
     ) t
group by id, (date - interval seqnum day);

如果original_column 真的在枚举相邻的日期,那么你甚至不需要子查询:

select id, min(date), max(original_col) as result_col
from t
group by id, (date - interval original_col day);

但是,我不知道这些值是否只是问题样本数据中的巧合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2019-10-14
    相关资源
    最近更新 更多