2017-09-14 84 views
1

我有一個表看起來像這樣(列數A-d):窗口功能/聚合函數/中斷窗口

A  B   C     D  E 
---------------------------------------------------------- 
1  2011  2011-06-30  A  2013-06-30 
1  2012  2012-06-30  A  2013-06-30 
1  2013  2013-06-30  A  2013-06-30 
1  2014  2015-06-30  B  2015-06-30 
1  2015  9999-12-31  A  9999-12-31 
2  2014  9999-12-31  C  9999-12-31 
2  2015  9999-12-31  C  9999-12-31 
2  2016  9999-12-31  C  9999-12-31 

我嘗試基於通過窗口功能,A-d創建山坳即我需要無d(如果它改變了下一個窗口應該開始)由A,B和C

+0

'select *,max(c)over(partition by D)from table'?.. next row have D ='A'again?.. –

+0

不,它不起作用。看看5行,它有D = A和C = 9999-12-31,因此E行1-3也是9999-12-31,OP不需要那麼做。 –

+0

如何得出第5行數據,與前3行數據不同 – Rams

回答

0

下令中斷計算最大(C)可以嘗試下面的查詢來獲得請求的結果

select t1.*,t2.C as E from table1 as t1 
(select D,max(c) C from table1 group by D) as t2 on t1.D=t2.D 
+0

不起作用。行1-3將得到9999-12-31,而不是2013-06-30 –

+0

@ŁukaszKamiński,它會失敗,但第5行的日期如何得出,與第3行的數據不同,它與第3行的數據不同 – Rams

1

你需要確定相鄰的組。一種方法使用不同的窗口函數來識別組:

select t.*, 
     max(c) over (partition by a, seqnum_a - seqnum_ad) as e 
from (select t.*, 
      row_number() over (partition by a order by b) as seqnum_a, 
      row_number() over (partition by a, d order by b) as seqnum_ad 
     from t 
    ) t; 

這很難解釋行號之間的差異是如何工作的。但是,如果您運行子查詢並盯着結果,您可能會看到它的工作原理。

+0

像魅力。謝謝! – Cedric