2017-10-18 36 views
1

我有一個表集團的價格與開始和結束日期

Recordid Price Start date end date 
----------------------------------------- 
1  20  2017-10-01 2017-10-02 
2  20  2017-10-03 2017-10-04 
3  30  2017-10-05 2017-10-05 
4  20  2017-10-06 2017-10-07 

我想每一個價格,當它開始和結束的,所以我的結果集將

20. 2017-10-01. 2017-10-04 
30. 2017-10-05. 2017-10-05 
20. 2017-10-06. 2017-10-07 

我有問題要弄清楚

這是一個Oracle數據庫

+0

我不明白規則。你如何確定價格20的兩個輸出記錄? – OldProgrammer

+0

簡單的第一個價格是從第一個到第四個20作爲前兩個記錄說那麼它是一天30作爲整數第三個記錄然後兩天20再次如第四個記錄 –

+0

基本上我需要一種方法來組合第一個兩條記錄與第四條分開,但我無法計算出 –

回答

1

我用下面的代碼想通了測試

SELECT distinct price 
     , case when start_dt is null then lag(start_dt) over (order by start_date) 
      else start_dt end realstart 
     , case when end_dt is null then lead(end_dt) over (order by end_date) 
      else end_dt end realend 
FROM (SELECT case when nvl(lag(price) over (order by start_date),-1) <> price then start_date end start_dt 
      , case when nvl(lead(price) over (order by end_date),-1) <>price then end_date end end_dt 
      , price 
      , start_date 
      , end_date 
     FROM t) main 
WHERE start_dt is not null 
    or end_dt is not null 
+0

使用{}圖標將所見即所得編輯器中的代碼塊或ctrl-K放入代碼塊。 – xQbert

+0

謝謝!我很感激 –

0

這裏有一個方法,可以在你的工作案例:

select price, min(start_date), max(end_date) 
from (select t.*, 
      sum(case when prev_price = price and prev_end_date = start_date - 1 
         then 0 else 1 
       end) over (order by t.start_date) as grp 
     from (select t.*, 
        lag(t.end_date) over (order by t.start_date) as prev_end_date, 
        lag(t.price) over (order by t.start_date) as prev_price 
      from t 
      ) t 
    ) t 
group by price, grp 
+0

我沒有看到這應該可以解決它 您指定1到第一個記錄0到第二個當你將它分組時,你會得到所有四條記錄 –

+0

@JacobGoldhirsch。 。 。有一個累計總和,你沒有考慮到。 –

+0

好的,我明天會測試 –

0

從你的樣本數據,我認爲你想擁有的開始日期,並且只要價格在備案編號的順序被改變的結束日期。 以下查詢可能包含比必要更多的子查詢,因爲可讀性。非常內在的選擇決定了價格何時發生變化,稱爲集團變化。下一個級別是來自該組的滾動總和。這是可能的,因爲只有組更改包含> 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')); 
相關問題