我正在尝试比较行值是否与之前的值相同,考虑它是由策略排序并在这种情况下更新同一个表中的列。
以下是我正在尝试做的一个例子:
此表按策略排序,“Equals”列的值为NULL(表1 ),所以我希望它更新它,所以如果“导入”列中的值是与此前一行的“导入”列中的值相同。
如果是这种情况,则“Equals”列上的值将更新为“Yes”,否则将为“No”( table 2 )。
表1:
Policy Import Equals
------ ------ ------
0001 2045.4 null
0001 1024.7 null
0002 111.0 null
0003 111.0 null
0006 2045.4 null
0008 1111.5 null
0008 123.4 null
0008 123.4 null
0010 9999.9 null
0120 123.4 null
表2:
Policy Import Equals
------ ------ ------
0001 2045.4 no
0001 1024.7 no
0002 111.0 yes
0003 111.0 yes
0006 2045.4 no
0008 1111.5 no
0008 123.4 yes
0008 123.4 yes
0010 9999.9 no
0120 123.4 no
这是创建表的SQL代码:
CREATE TABLE Example
(
Policy varchar(20),
Import Decimal(15,2),
Equals varchar(6)
)
INSERT INTO Example VALUES('0001',2045.4,null)
INSERT INTO Example VALUES('0001',1024.7,null)
INSERT INTO Example VALUES('0002',111.0,null)
INSERT INTO Example VALUES('0003',111.0,null)
INSERT INTO Example VALUES('0006',2045.4,null)
INSERT INTO Example VALUES('0008',1111.5,null)
INSERT INTO Example VALUES('0008',123.4,null)
INSERT INTO Example VALUES('0008',123.4,null)
INSERT INTO Example VALUES('0010',9999.9,null)
INSERT INTO Example VALUES('0120',123.4,null)
这就是我一直在尝试但没有成功的事情:
WITH temp
AS (
SELECT c.*, ROW_NUMBER() OVER (ORDER BY c.Policy) as rowNumber
FROM Example c
)
SELECT
x.*
FROM temp x
WHERE x.Import = (SELECT y.Import FROM temp y WHERE y.rowNumber = x.rowNumber - 1)
预期结果:
Policy Import Equals rowNumber
0002 111.0 NULL 3
0003 111.0 NULL 4
0008 123.4 NULL 7
0008 123.4 NULL 8
另外,我如何在“更新”查询中执行此操作?
非常感谢你的帮助!
答案 0 :(得分:0)
您需要在表中添加ID(例如IDENTITY(1,1))并在查询中使用它而不是rowNumber。 将其作为聚簇索引和主键以最大化性能。