從你的樣本數據,我認爲你想擁有的開始日期,並且只要價格在備案編號的順序被改變的結束日期。 以下查詢可能包含比必要更多的子查詢,因爲可讀性。非常內在的選擇決定了價格何時發生變化,稱爲集團變化。下一個級別是來自該組的滾動總和。這是可能的,因爲只有組更改包含> 0的值。其餘顯而易見。
SELECT GRP,
PRICE,
MIN("Start date") AS "Start date",
MAX("end date") AS "end date"
FROM (SELECT sub.*,
SUM(GROUP_CHANGE) OVER (ORDER BY RECORDID) AS GRP
FROM (SELECT t.*,
CASE
WHEN RECORDID = LAG(t.RECORDID) OVER (ORDER BY t.PRICE, t.RECORDID) + 1
THEN 0
ELSE RECORDID
END AS GROUP_CHANGE
FROM t) sub) fin
GROUP BY GRP, PRICE
ORDER BY GRP
GRP PRICE Start date end date
---------- ---------- ---------- --------
1 20 01.10.17 04.10.17
4 30 05.10.17 05.10.17
8 20 06.10.17 11.10.17
與下面的數據(請注意,我有添加一些記錄到您的deliverd樣本數據,我想有三個記錄一組)
CREATE TABLE t (
Recordid INT,
Price INT,
"Start date" DATE,
"end date" DATE
);
INSERT INTO t VALUES (1, 20, TO_DATE('2017-10-01', 'YYYY-MM-DD'), TO_DATE('2017-10-02', 'YYYY-MM-DD'));
INSERT INTO t VALUES (2, 20, TO_DATE('2017-10-03', 'YYYY-MM-DD'), TO_DATE('2017-10-04', 'YYYY-MM-DD'));
INSERT INTO t VALUES (3, 30, TO_DATE('2017-10-05', 'YYYY-MM-DD'), TO_DATE('2017-10-05', 'YYYY-MM-DD'));
INSERT INTO t VALUES (4, 20, TO_DATE('2017-10-06', 'YYYY-MM-DD'), TO_DATE('2017-10-07', 'YYYY-MM-DD'));
INSERT INTO t VALUES (5, 20, TO_DATE('2017-10-08', 'YYYY-MM-DD'), TO_DATE('2017-10-09', 'YYYY-MM-DD'));
INSERT INTO t VALUES (6, 20, TO_DATE('2017-10-10', 'YYYY-MM-DD'), TO_DATE('2017-10-11', 'YYYY-MM-DD'));
我不明白規則。你如何確定價格20的兩個輸出記錄? – OldProgrammer
簡單的第一個價格是從第一個到第四個20作爲前兩個記錄說那麼它是一天30作爲整數第三個記錄然後兩天20再次如第四個記錄 –
基本上我需要一種方法來組合第一個兩條記錄與第四條分開,但我無法計算出 –