我有一個非常大的數據集,其中包含人員以及他們保險的開始和結束日期。每個人可以有多個重疊日期的記錄。我需要爲每個人找到每個「島」的開始和結束。PL/SQL:在由開始和結束定義的重疊日期範圍中查找島嶼
例如:
SKP_PERSON DATE_INSURANCE_START DATE_INSURANCE_END SKP_INSURANCE
1 1 7.11.2015 1.1.3000 1
2 1 7.11.2015 1.1.3000 2
3 2 10.4.2015 1.8.2016 23:59:59 3
4 3 28.3.2016 1.1.3000 4
5 4 5.12.2015 31.12.2015 23:59:59 5
6 4 5.12.2015 1.5.2016 23:59:59 6
7 4 1.2.2016 1.5.2016 23:59:59 7
8 5 15.1.2016 2.3.2016 23:59:59 8
9 5 15.3.2016 2.6.2016 23:59:59 9
結果我需要的是這樣的:
SKP_PERSON DATE_INSURANCE_START DATE_INSURANCE_END
1 1 7.11.2015 1.1.3000
2 2 10.4.2015 1.8.2016 23:59:59
3 3 28.3.2016 1.1.3000
4 4 5.12.2015 1.5.2016 23:59:59
5 5 15.1.2016 2.3.2016 23:59:59
6 5 15.3.2016 2.6.2016 23:59:59
我設法找到通過連接所有可能的時間(從分鐘(開始溶液)最大值(結束)),併爲每一天找到滯後和主導值 - 但是記錄太多,日期範圍太大,因此需要很長時間。有沒有更有效的解決方案使用PL/SQL?
編輯: 我試過(簡體)查詢:
WITH table1 AS (
SELECT d.dtime_day, COUNT(i.dkp_insurance), i.skp_person
FROM date d --a date table, contains a record for every day
JOIN insurance i ON d.dtime_day BETWEEN i.DATE_INSURANCE_START AND i.DATE_INSURANCE_END
GROUP BY d.dtime_day, i.skp_person
)
SELECT * FROM
(
SELECT distinct skp_person,
CASE WHEN LAG(dtime_day) OVER (PARTITION BY skp_person ORDER BY dtime_day) <> dtime_day -1 THEN dtime_day END AS start,
CASE WHEN LEAD(dtime_day) OVER (PARTITION BY skp_person ORDER BY dtime_day) <> dtime_day +1 THEN dtime_day END AS end
FROM table1 t1)
WHERE start IS NOT NULL OR end IS NOT NULL
ORDER BY skp_person
;
你能提供你已經試過SQL?另外,這些表上是否有索引?謝謝。 – Nick
我不太清楚我在使用索引的數據倉庫中的表格 - SKP_INSURANCE是主鍵。我將在編輯中添加代碼。 – vergis
幾天前我回答過類似的問題,請看看。從你寫的代碼中我可以看出你可以處理SQL,你所需要的只是算法的想法(解決問題的方法);如果你認爲你可以使用我的解決方案,但你需要進一步的幫助,請說出來。祝你好運! http://stackoverflow.com/questions/36387048/get-envelope-ie-overlapping-time-spans/36408651#36408651 – mathguy