当一个的结束时间是另一个的开始时间时组合行,如果不是,则在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
答案 0 :(得分:0)
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
说明:
答案 1 :(得分:0)
您需要定义组合的所有行。执行此操作的一种方法是将组分配给行并确定新组从何处开始。然后:
这看起来像:
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;