首页 > 解决方案 > 当一个的结束时间是另一个的开始时间时合并行,如果不是,那么就像在 SQL 中一样

问题描述

当一个的结束时间是另一个的开始时间时合并行,如果不是,那么就像在 SQL 中一样。例如:

DATE_SRNO   start                   End                       Actual_Date
1          2018-08-04 12:22:00.000  2018-08-04 13:22:00.000   2018-08-04
1          2018-08-04 13:22:00.000  2018-08-04 16:46:00.000   2018-08-04
1          2018-08-04 20:17:00.000  2018-08-04 21:16:00.000   2018-08-04
1          2018-08-04 22:12:00.000  2018-08-04 22:28:00.000   2018-08-04
2          2018-08-05 19:08:00.000  2018-08-05 20:00:00.000   2018-08-05
2          2018-08-05 20:00:00.000  2018-08-05 20:52:00.000   2018-08-05
3          2018-08-20 07:27:00.000  2018-08-21 06:00:00.000   2018-08-20
3          2018-08-21 03:36:00.000  2018-08-21 04:36:00.000   2018-08-20
3          2018-08-21 04:36:00.000  2018-08-21 06:00:00.000   2018-08-20

预期输出:

Sr.No   start                    End                        Actual_Date
1       2018-08-04 12:22:00.000 2018-08-04 16:46:00.000     2018-08-04
1       2018-08-04 20:17:00.000 2018-08-04 21:16:00.000     2018-08-04
1       2018-08-04 22:12:00.000 2018-08-04 22:28:00.000     2018-08-04
2       2018-08-05 19:08:00.000 2018-08-05 20:52:00.000     2018-08-05
3       2018-08-20 07:27:00.000 2018-08-21 06:00:00.000     2018-08-20
3       2018-08-21 03:36:00.000 2018-08-21 06:00:00.000     2018-08-20

我试过下面的查询,但没有得到确切的输出。

SELECT
    T1.Malf_start,
    T2.MalfEnd,
    T1.COMPARE_DATE
FROM
    #temp T1
INNER JOIN
    #temp T2
    ON T2.DATE_SRNO = T1.DATE_SRNO
    AND T2.Malf_start = T1.MalfEnd

下面是我得到的结果。

start                   End                     Actual_Date
2018-08-04 12:22:00.000 2018-08-04 16:46:00.000 2018-08-04
2018-08-05 19:08:00.000 2018-08-05 20:52:00.000 2018-08-05
2018-08-21 03:36:00.000 2018-08-21 06:00:00.000 2018-08-20

标签: sqlsql-serversql-server-2017

解决方案


SELECT
    t1.malf_start,
    COALESCE(t2.malf_end, t1.malf_end) AS malf_end,
    t1.actual_date
FROM
    test_date t1
LEFT JOIN
    test_date t2
    ON t1.actual_date = t2.actual_date
    AND t1.malf_end = t2.malf_start
LEFT JOIN
    test_date t3
    ON t1.actual_date = t3.actual_date
    AND t1.malf_start = t3.malf_end
WHERE t3.malf_start IS NULL

说明:

  • T1 是所有记录的列表。
  • T2 是开始日期与 T1 中的结束日期匹配的记录。
  • 如果没有 T2 匹配,我们将显示原始 T1 结束日期。
  • T3 是检查 T2 中是否使用了任何 T1 记录。我们不想显示已附加到 T1 记录的记录。

推荐阅读