2016-03-13 29 views
0

我試圖以某種方式獲取數據組織。這裏是我想要做的從Redshift獲取數據clubbed

我有紅移表,從中我們正在試圖讓下面的輸出

表:富

 
e1 | c1 | c2 
1 | 1 | 2 
1 | 3 | 4 
1 | 5 | 7 
1 | 9 | 15 
2 | 3 | 4 
2 | 7 | 8 

我們正試圖俱樂部所有行,其中前一行C2下一行C1之間差值小於1

所需的輸出

 
e1 | c1 | c2 
1 | 1 | 7 
1 | 9 | 15 
2 | 3 | 4 
2 | 7 | 8 

電流輸出

 
e1 | c1 | c2 
1 | 1 | 4 
1 | 3 | 7 
2 | 3 | 4 
2 | 7 | 8 

我試過做CTE。這是我正在處理的查詢。我得到的是隔離的,或與

CTE結果:

with es as(
select * 
from foo 
where e1 not in (SELECT t1.e1 
    FROM foo as t1 
    inner join foo as t2 
    on t1.e1=t2.e1 and (t2.c1-t1.c2)=1) 
union all 
SELECT t1.e1 
     ,t1.c1 
     ,isnull(t2.c2, t1.c2) as c2 
    FROM foo as t1 
    inner join foo as t2 
    on t1.e1=t2.e1 and (t2.c1-t1.c2)=1 
) 
select * from es 
where e1 is not null 

有人可以幫我嗎?

回答

2

我認爲你的意思是「我們正在嘗試將前一排c2下一行c1之間的差異小於1 ,其中e1與相同」。

您可以使用Window FunctionsLEAD會給你下面C1(提供順序是正確的),然後你可以對過濾:

SELECT 
    e1, 
    c1, 
    c2 
FROM (
     SELECT 
     e1, 
     c1, 
     c2, 
     LEAD(c1, 1) 
     OVER (PARTITION BY e1 
      ORDER BY e1 ASC, c1 ASC, c2 ASC) AS lead_c1 
     FROM so_test 
     ORDER BY e1 ASC, c1 ASC, c2 ASC) AS with_lead 
WHERE lead_c1 - c2 != 1 OR lead_c1 IS NULL 

輸出:

e1|c1|c2 
1 |5 |7 
1 |9 |15 
2 |3 |4 
2 |7 |8 

沒有表結構的內部知識,我不得不下令通過所有列確保行的順序與您發佈的順序相同。如果你有另一個鍵(比如排序鍵),最好使用它。

如果我對的假設與e1是相同的是錯誤的,請刪除「PARTITION BY e1」。

+0

答案並不完整,但我理解了這種方法。謝謝@ denismo –