比较previus行以设置“StatusFlag”

时间:2016-11-24 11:03:39

标签: sql sql-server

我想比较表格中“ExtractTypeNum”的前一行。因此,如果它从前一个更改,则标志应设置为“isChanged”。

我试图通过案例陈述来开发这个但没有任何成功。

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 个答案:

答案 0 :(得分: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