SQL Server更新列,比较跨行的值

4
我需要通过交叉检查value2和下一行的value1来更新以下表格的column3。
如果相等,则value3 = value1 * value2,否则value3 = value1。
CREATE TABLE #tmpValue1(id INT IDENTITY(1,1), value1 FLOAT, value2 FLOAT, value3 FLOAT)

INSERT INTO #tmpValue1(value1, value2) VALUES 
(1, 2), (2,3), (3,4), (4,5),(6,7),(7,8),(8,9)

#tmpValue1表将如下所示:

id  value1  value2  value3 (expected output)
1   1       2       1    
2   2       3       4
3   3       4       9
4   4       5       16
5   6       7       6
6   7       8       49
7   8       9       64

以上,因为Value2行的第二个值与Value1行的第二个值相比较,所以在第一个中更新了value3并加上了1,因此它将从第二个开始更新。

注意:Value1和Value2只是示例,实际情况可能不同。

2个回答

4
我们可以通过使用LEFT JOIN来简单地完成它,如下所示:
UPDATE t1 SET t1.value3 = (ISNULL(t2.value2,1) * t1.value1)
FROM #tmpValue1 t1
LEFT JOIN #tmpValue1 t2 ON t1.id = t2.id+1
    AND t1.value1 = t2.value2

我们应该使用身份列(id),这有利于执行此类操作。

1
你可以使用LAG...,尽管你期望的输出似乎有一些错误。
select 
    ID, 
    Value1, 
    Value2,
    case 
        when lag(value2) over (order by ID) = value1 then lag(value2) over (order by ID) * value1 
        else value1 end as Value3
from #tmpValue1

结果

ID  Value1  Value2  Value3
1   1       2       1
2   2       3       4
3   3       4       9
4   4       5       16
5   6       7       6
6   7       8       49
7   8       9       64

谢谢,我已经纠正了我的错误,并期望更易理解的答案,尽管我会浏览所有内容。 - Fever
@Fever LAG和LEAD是SQL函数,用于查看指定列的前一行或后一行。我按照您的要求查看了下一行。必须使用OVER子句为数据集提供排序。您还可以查看从基础行开始的n行。例如,将其与向下4行进行比较。 - S3S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接