【问题标题】:MySQL merge rows with same ID while preserving timestampsMySQL 合并具有相同 ID 的行,同时保留时间戳
【发布时间】:2016-12-27 18:00:41
【问题描述】:

我有下表的数据:

表 1:

ID          START_DATE                 END_DATE
--          ----------                 --------
1        2016-08-20 00:01:00              NULL
1        2016-08-20 00:02:00              NULL
1              NULL                2016-08-20 00:03:00
1              NULL                2016-08-20 00:04:00

我想“合并”唯一 ID 1 的数据,以便我可以轻松读取它。它应该如下所示(基本上是获取 START_DATE 的最早时间戳和 END_DATE 的最新时间戳):

表 2:

ID         START_DATE                 END_DATE
--         ----------                 --------
1      2016-08-20 00:01:00       2016-08-20 00:04:00

这最终是为了让我可以确定以下 TX_ID 记录是否在 START_DATE 和 END_DATE 范围内,并将 FALL_WITHIN_START_AND_END 参数设置为 True。

表 3:

TX_ID         TIMESTAMP          FALL_WITHIN_START_AND_END
-----         ---------          -------------------------
123456    2016-08-20 00:02:35              True

有人可以推荐一个 MySQL 查询来“合并”表 1 的值,使其看起来像表 2?这样我可以更轻松地确定表 3 中的 TX_ID 是否在完整的开始和结束日期范围内。

提前感谢您的帮助!

【问题讨论】:

    标签: mysql join merge timestamp


    【解决方案1】:

    Barmar 对您问题的第一部分提出了很好的方法。但是,对于完整的答案,您可以使用exists

    select t3.*,
           (case when exists (select 1
                              from table1 t1
                              where t1.id = t3.id and t1.start_date <= t3.timestamp
                             ) and
                      exists (select 1
                              from table1 t1
                              where t1.id = t3.id and t1.end_date >= t3.timestamp
                             ) 
                 then 1 else 0
            end) as fall_within_start_and_end 
    from table3 t3;
    

    group by 相比,这种方法的优势在于它可以利用table1(id, start_date)table1(id, end_date) 上的索引。

    【讨论】:

      【解决方案2】:

      这是一个简单的GROUP BY 使用MINMAX 函数。

      SELECT id, MIN(start_date) AS start_date, MAX(end_date) AS end_date
      FROM Table1
      GROUP BY id
      

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 2016-05-18
        • 2022-10-26
        • 1970-01-01
        • 2016-10-14
        相关资源
        最近更新 更多