SQL Server 2008查询比较行值是否与之前的行相同

时间:2018-01-15 17:44:32

标签: sql-server performance sql-server-2008

我正在尝试比较行值是否与之前的值相同,考虑它是由策略排序并在这种情况下更新同一个表中的列。

以下是我正在尝试做的一个例子:

此表按策略排序,“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

另外,我如何在“更新”查询中执行此操作?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

您需要在表中添加ID(例如IDENTITY(1,1))并在查询中使用它而不是rowNumber。 将其作为聚簇索引和主键以最大化性能。