我想比较表格中“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 |
+----------------+--------------+------------------+------------------+--------+-------------+
答案 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