DATE2
是当前行上的时间 - 在计算,这是结束时间
LAG(DATE2) over (PARTITION BY NAME, TRUNC(DATE2) ORDER BY DATE2)
是前一行的时间(当按日期排序时) - 在计算中,这是开始时间
它确实如此简单。
我更新了以下内容(希望)以符合您的更新要求。
查询A使用LAG和LEAD函数来确定每行是否位于一组条目的开始位置(前一行> 30分钟差异)或一组条目的末尾(下一行> 30分钟差异)
查询乙然后将结果限制行,它们或者开始或结束行(一切仅仅是噪声)
最后每个开始和结束连接在一起成一个单一的一行。
WITH
test_data (name, date2) AS
(SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:27:24','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:27:24','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:27:24','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:27:24','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:31:31','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:31:31','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:31:31','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:31:31','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:40:00','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 09:40:00','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 16:42:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 16:42:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 16:42:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 16:45:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 16:45:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 18:00:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 18:00:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'Humpty Dumpty',TO_DATE('21/07/2016 18:00:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'ABC',TO_DATE('21/07/2016 18:00:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'ABC',TO_DATE('21/07/2016 18:10:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'ABC',TO_DATE('21/07/2016 18:50:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL UNION ALL
SELECT 'ABC',TO_DATE('21/07/2016 18:51:03','DD/MM/YYYY HH24:MI:SS') FROM DUAL
)
SELECT
name
,TO_CHAR(start_time,'DD/MM/YYYY HH24:MI:SS') start_time
,TO_CHAR(end_time,'DD/MM/YYYY HH24:MI:SS') end_time
FROM
--Query B
(SELECT
name
,date2 start_time
,LEAD(date2) OVER (PARTITION BY name,TRUNC(date2) ORDER BY date2) end_time
,start_flag
FROM
--Query A
(SELECT
name
,date2
,CASE
WHEN date2 - LAG(date2) OVER (PARTITION BY name, TRUNC(date2) ORDER BY date2) <= (1/48)
THEN 'N'
ELSE 'Y'
END start_flag
,CASE
WHEN LEAD(date2) OVER (PARTITION BY name, TRUNC(date2) ORDER BY date2) - date2 <= (1/48)
THEN 'N'
ELSE 'Y'
END end_flag
FROM
test_data
ORDER BY
name
,date2
)
WHERE 1=1
AND (start_flag = 'Y' OR end_flag = 'Y')
)
WHERE start_flag = 'Y'
;
您能否也显示一些示例数据?这会让你的问题(以及任何答案)对可能面临类似问题的其他人更有用。 –
@TimBiegeleisen - 您可以在OTN上找到示例数据,其中几天前提出了原始问题。https://community.oracle.com/thread/3974725 – mathguy
@mathguy感谢您的侦探工作,但问题应该至少包括一些示例数据。 –