2016-09-14 42 views
0

請參考下面的樣本表。我的表有ID,ID_Type,滯後和Row_Num。我需要在下面創建「New_Col」列。我近距離使用MAX窗口功能,但我仍然沒有成功。任何幫助將非常感謝 - 如果窗口功能不是我要走的路,我肯定會接受建議。如何使用延遲/最大窗口函數添加常量?

這裏是我以前在下面的示例表到達SQL:

SELECT ID, 
     ID_TYPE, 
     LAG(ID_TYPE) OVER (ORDER BY Row_Num) AS Lag, 
     Row_Num 
FROM (SELECT ID, 
      CASE WHEN ID LIKE '%Exc%' 
        THEN ID 
      END AS ID_Type, 
      Row_Num 
     FROM Source_Table) 

樣品表:

ID  ID_Type Lag  Row_Num 
Exc  Exc    1 
10R46    Exc  2 
10R46      3 
100R91      4 
Non_Exc Non_Exc   5 
10R91    Non_Exc 6 
10M95      7 

所需的輸出:

ID  ID_Type Lag  New_Col Row_Num 
Exc       Exc  1 
10R46 Exc    Exc  2 
10R46    Exc  Exc  3 
100R91      Exc  4 
Non_Exc Non_Exc   Non_Exc 5 
10R91    Non_Exc Non_Exc 6 
10M95      Non_Exc 7 
+0

請提供SQL創建您的源表和一些示例數據。看起來你正走在一條糟糕的道路上,並要求我們從那裏繼續前行。我得到的印象是一個完全不同的解決方案,你從這裏開始的解決方案將是最好的。 – iamdave

+0

@iamdave,源表實際上是一個預定的(Excel)報表,屬性管理系統。我沒有創建表格,而是將Excel文件加載到Domo(BI工具)中,然後將該文件轉換爲表格。在Domo中,我可以使用Redshift或MySQL進行額外的ETL工作。 – izzy84

+0

您的預期產出是多少?考慮到樣本數據是輸入.. –

回答

0

添加一個IGNORE NULLS規範的LAG窗函數實現了我一直在尋找。

SELECT ID, 
     ID_TYPE, 
     LAG(ID_TYPE IGNORE NULLS) OVER (ORDER BY Row_Num) AS Lag, 
     Row_Num 
FROM (SELECT ID, 
      CASE WHEN ID LIKE '%Exc%' 
        THEN ID 
      END AS ID_Type, 
      Row_Num 
     FROM Source_Table) 

返回:

ID  ID_Type Lag  Row_Num 
Exc  Exc    1 
10R46    Exc  2 
10R46    Exc  3 
100R91   Exc  4 
Non_Exc Non_Exc Exc  5 
10R91    Non_Exc 6 
10M95    Non_Exc 7 
0

一種方法是產生量程鍵

Declare @YourTable table (ID varchar(50),ID_Type varchar(50),Lag varchar(50),Row_Num int) 
Insert into @YourTable values 
('Exc','Exc','',1), 
('10R46','','Exc',2), 
('10R46','','',3), 
('100R91','','',4), 
('Non_Exc','Non_Exc','',5), 
('10R91','','Non_Exc',6), 
('10M95','','',7) 

;with cteR1 as (Select ID_Type,R1=min(Row_Num) from @YourTable Where ID_Type<>'' Group by ID_Type 
    ), cteR2 as (Select A.ID_Type,A.R1,R2=isnull(min(B.R1),9999)-1 From cteR1 A Left Join cteR1 B on (B.R1>A.R1) Group By A.ID_Type,A.R1) 
Select A.ID 
     ,A.ID_Type 
     ,A.Lag 
     ,New_Col=B.ID_Type 
     ,A.Row_Num 
From @YourTable A 
Join cteR2 B on Row_Num between R1 and R2 
Order By Row_Num 

返回

ID  ID_Type Lag  Row_Num New_Col 
Exc  Exc    1  Exc 
10R46   Exc  2  Exc 
10R46     3  Exc 
100R91     4  Exc 
Non_Exc Non_Exc   5  Non_Exc 
10R91   Non_Exc 6  Non_Exc 
10M95     7  Non_Exc