2016-09-14 11 views
0

下記のサンプル表を参照してください。私のテーブルにID、ID_Type、Lag、およびRow_Numがあります。下の "New_Col"列を作成する必要があります。私はMAXウィンドウ関数を使用して近づいていますが、まだ成功していません。どんな助けも大いに評価されるだろう - 窓関数が行く方法でないならば、私は間違いなく提案に開かれている。ここでLag/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内では、追加のETL作業にRedshiftまたはMySQLを使用できます。 – izzy84

+0

期待される出力は何ですか?サンプルデータが入力されたことを考えると、 –

答えて

0

LAGウィンドウ関数にIGNORE NULLS仕様を追加私が探していたものを実現しています。

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 
関連する問題