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感謝您的偵探工作,但問題應該至少包括一些示例數據。 –