如果 ID 在任何行中具有特定值,则更改值

Posted

技术标签:

【中文标题】如果 ID 在任何行中具有特定值,则更改值【英文标题】:Changing Values if ID Has a Certain Value in Any Row 【发布时间】:2020-07-22 23:33:15 【问题描述】:

我的表中有两列。一列是 ID,另一列是 TestResult。此表中有具有相同 ID 的行。假设 TestResult 可以是“Positive”、“Negative”、“Pending”或“Unknown”。因此,同一个 ID 可以显示“肯定”、“否定”、“待定”或“未知”。

这是我希望输出显示的内容。如果 ID 在任何行中都包含“正”,我希望该 ID 显示“正”。否则保持不变。

提前致谢!

【问题讨论】:

请展示一些示例数据、预期结果和您的尝试。 所以您只想显示每个 ID 一次,还是什么?这不是很清楚。我同意,样本数据和预期的查询结果会有很大帮助 如果一个 ID 有四行,您是要显示所有四行还是只显示一个“摘要”行? 【参考方案1】:

如果我没看错,你可以使用窗口函数和case 表达式:

select
    id,
    case when max(case when test_result = 'Positive' then 1 else 0 end) over(partition by id) = 1
        then 'Positive'
        else testResult
    end testResult
from mytable 

【讨论】:

这个问题有点不清楚,但我想这就是OP想要的。 @BRuppert,请将其标记为答案。所以对以后的其他人有帮助【参考方案2】:

CASE & Window Functions 的答案效果很好......但是这里有一个使用子查询的选项。

IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData

SELECT * INTO #TestData FROM (VALUES
    (1, 'Positive'),
    (2, 'Positive'),
    (2, 'Negative'),
    (3, 'Unknown'),
    (3, 'Negative'),
    (3, 'Positive'),
    (4, 'Pending'),
    (4, 'Positive'),
    (5, 'Unknown'),
    (6, 'Negative'),
    (7, 'Unknown'),
    (7, 'Positive'),
    (8, 'Positive')
) S(ID, TestResult)

-- Display Test Result Data
SELECT ID, TestResult FROM #TestData

-- Display Query Proposal
SELECT
    ID,
    CASE WHEN EXISTS(SELECT * FROM #TestData T2 WHERE T2.ID = T1.ID AND T2.TestResult = 'Positive') THEN 'Positive' ELSE T1.TestResult END
FROM
    #TestData T1

【讨论】:

以上是关于如果 ID 在任何行中具有特定值,则更改值的主要内容,如果未能解决你的问题,请参考以下文章

数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组

如果这些行中至少有一个具有给定值,则选择具有给定 ID 的所有行

如果类包含值,则更改背景颜色

如果ReactJS状态具有map属性,则更改映射值不会反映状态

如果列包含特定值,则更改表格行的颜色

SQL 聚合具有相同 id 的行,辅助列中的特定值