我需要一个查询来比较基于相同id的表行值,并相应地更新Status列.如果相同ID的值匹配,则将状态更新为已匹配或未匹配

ID Value Status
1 AAA MATCHED
2 BBB MATCHED
3 CCC NOT MATCHED
1 AAA MATCHED
2 BBB MATCHED
3 CXX NOT MATCHED

推荐答案

您可以避免自联接操作,并使用几个窗口函数来判断id上的max与id上的min值何时相同.

SELECT ID,
       Status_, 
       CASE WHEN MIN(Value_) OVER(PARTITION BY ID)
               = MAX(Value_) OVER(PARTITION BY ID)
            THEN 'Matched'
            ELSE 'Not Matched'
       END AS Status_ 
FROM tab

如果您已经有一个状态值,并且需要更新它,则可以在UPDATE语句中使用相同的查询,如下所示:

WITH cte AS ( 
    SELECT tab.*, 
           CASE WHEN MIN(Value_) OVER(PARTITION BY ID)
                   = MAX(Value_) OVER(PARTITION BY ID)
                THEN 'Matched'
                ELSE 'Not Matched'
           END AS newStatus 
    FROM tab
)
UPDATE cte
SET Status_ = newStatus
WHERE NOT Status_ = newStatus;

Output:

ID Value_ Status_
1 AAA Matched
1 AAA Matched
2 BBB Matched
2 BBB Matched
3 CCC Not Matched
3 CXX Not Matched

查看演示here.

Sql相关问答推荐

Snowflake SQL比较克隆x原始计数

如何将资源密集型自连接转换为更快的查询?

转换表中的数据

如果元素包含通过SQL指定的字符串,则过滤掉数组元素

导出部分条形码字符串GS1-128

在xml.Modify方法中使用子字符串和可能的替代方法

每小时 Select 1行

将一个数组反嵌套到另外两个数组SQL中(Athena/presto)

带日期函数的复合索引不允许只扫描索引吗?

更正用于判断错误组合的SQL

SQL按组 Select 最小值,当值不存在时为Null

按二维数组的第一个元素排序

SAS proc freq 或 proc sql 获取数据子集和整个数据的频率

如何将 START 和 END 日期之间的日期差异作为 SQL 中的单独列获取

复制SQL Server临时表

带有数组输入参数的Snowflake UDF优化

当该日期的至少两条记录具有相同的持续时间或至少一条记录的持续时间为 0 时,如何标记该日期的所有记录

Select 字段,除非另一个字段包含重复项

超过100名员工的连续行

根据条件列出不同的值