Объедините строки, когда время окончания одного - это время начала другого, если нет, то как в SQL - PullRequest
0 голосов
/ 20 сентября 2018

Объедините строки, когда время окончания одного - это время начала другого, если нет, то как в 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

Ниже приведен результат Iполучил.

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вам необходимо определить все строки, которые объединяются.Один из способов сделать это - назначить группу строкам и определить, где начинаются новые группы.Тогда:

  • Совокупная сумма начальных чисел для определения группы
  • Агрегирование по группам

Это выглядит так:

select date_srno,
       min(malfstart), max(malfend)
from (select t.*,
             sum(case prev_malfend = malfstart then 0 else 1 end) over (partition by date_srno order by malfstart) as grp
      from (select t.*,
                   lag(t.malfend) over (partition by t.date_srno order by t.mslfstart) as prev_malfend
            from #temp t
           ) t
     ) t
group by date_srno, grp;
0 голосов
/ 20 сентября 2018
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 - проверка того, использовались ли какие-либо записи T1 в T2.Мы не хотим показывать записи, уже прикрепленные к записям T1.
...