2016-11-24 54 views
1

我想比較我的表中「ExtractTypeNum」的前一行。所以如果它從之前的標誌更改爲「isChanged」。比較previus行設​​置「StatusFlag」

我試圖用case語句來開發,但沒有任何成功。

select * 
    (case 
     when rownum = rownum-1 
      then 
       (case when 
       extractTypeNum <> extractTypeNum 
        then Null 
        else 'IsChanged' end) 
      when rownum = rownum -'1' then '3' 
     else '4' end) as StatusFlag 
from myTable 

這是表的結構和一些樣本數據:

CREATE TABLE mytable(
    ExtractTypeNum INTEGER NOT NULL PRIMARY KEY 
    ,FileOrderNum  VARCHAR(11) NOT NULL 
    ,PrevFileOrderNum VARCHAR(11) NOT NULL 
    ,NextFileOrderNum VARCHAR(11) NOT NULL 
    ,rownum1   INTEGER NOT NULL 
    ,Statusflag1  VARCHAR(9) NOT NULL 
); 
INSERT INTO mytable(ExtractTypeNum,FileOrderNum,PrevFileOrderNum,NextFileOrderNum,rownum1,Statusflag1) 
VALUES (1,'2016-09-191',NULL,'2016-09-192',1,'IsInitial'); 
INSERT INTO mytable(ExtractTypeNum,FileOrderNum,PrevFileOrderNum,NextFileOrderNum,rownum1,Statusflag1) 
VALUES (2,'2016-09-192','2016-09-191','2016-09-201',2,NULL); 
INSERT INTO mytable(ExtractTypeNum,FileOrderNum,PrevFileOrderNum,NextFileOrderNum,rownum1,Statusflag1) 
VALUES (1,'2016-09-201','2016-09-192','2016-09-211',3,NULL); 
INSERT INTO mytable(ExtractTypeNum,FileOrderNum,PrevFileOrderNum,NextFileOrderNum,rownum1,Statusflag1) 
VALUES (1,'2016-09-211','2016-09-201','2016-09-222',4,NULL); 
INSERT INTO mytable(ExtractTypeNum,FileOrderNum,PrevFileOrderNum,NextFileOrderNum,rownum1,Statusflag1) 
VALUES (2,'2016-09-222','2016-09-211',NULL,5,'IsLatest'); 

Expected output 
+----------------+--------------+------------------+------------------+--------+-------------+ 
| ExtractTypeNum | FileOrderNum | PrevFileOrderNum | NextFileOrderNum | rownum | Statusflag1 | 
+----------------+--------------+------------------+------------------+--------+-------------+ 
|    1 | 2016-09-191 | NULL    | 2016-09-192  |  | IsInitial | 
|    2 | 2016-09-192 | 2016-09-191  | 2016-09-201  |  | IsChanged | 
|    1 | 2016-09-201 | 2016-09-192  | 2016-09-211  |  | IsChanged | 
|    1 | 2016-09-211 | 2016-09-201  | 2016-09-222  |  | NULL  | 
|    2 | 2016-09-222 | 2016-09-211  | NULL    |  | IsLatest | 
+----------------+--------------+------------------+------------------+--------+-------------+ 

回答

1

如果您正在使用SQL Server 2012或更高版本,那麼你可以嘗試以下查詢:

;WITH CTE AS (
    SELECT ExtractTypeNum, FileOrderNum, PrevFileOrderNum, 
      NextFileOrderNum, rownum1, Statusflag1, 
      ROW_NUMBER() OVER (ORDER BY rownum1) AS rn, 
      COUNT(*) OVER() AS totalCnt, 
      LAG(ExtractTypeNum) OVER (ORDER BY rownum1) AS prevExtractTypeNum    
    FROM mytable 
) 
SELECT ExtractTypeNum, FileOrderNum, PrevFileOrderNum, 
     NextFileOrderNum, rownum1, Statusflag1, 
     CASE 
      WHEN rn = 1 THEN 'IsInitial' 
      WHEN rn = totalCnt THEN 'IsLatest' 
      WHEN prevExtractTypeNum <> ExtractTypeNum THEN 'IsChanged' 
     END AS StatusFlag 
FROM CTE