根据列上的条件获取记录的单个值

Posted

技术标签:

【中文标题】根据列上的条件获取记录的单个值【英文标题】:Fetch single value for a record based on a condition on column 【发布时间】:2021-12-31 22:51:51 【问题描述】:

我正在尝试对 ID 列中的记录进行分组并检查任何状态是否为 1,然后将状态替换为“IN”。如果我在状态中没有找到值 1,那么我将状态替换为“OUT”。

原表:

ID Status
ID_1 1
ID_1 0
ID_2 1
ID_1 0
ID_2 1
ID_3 0
ID_2 0
ID_3 0

决赛桌应该是这样的

ID Status
ID_1 IN
ID_2 IN
ID_3 OUT

如果有人可以提供帮助,请告诉我:)

【问题讨论】:

您使用的是哪个 RDBMS?请将其标签添加到您的问题中。 我正在使用 mysql。我现在已经添加了标签。 【参考方案1】:

将 1,0 转换为 IN,OUT 并取其最小值(min 因为 'IN' 小于 'OUT'):

select id, min(case status when 1 then 'IN' else 'OUT' end) as status
from mytable
group by id

如果是mysql,就稍微简单一点:

select id, min(case status then 'IN' else 'OUT' end) as status
from mytable
group by id

因为在mysql中,1为真,0为假。


如果列具有值 'IN' 和 'OUT' 它就变成了:

select id, min(status)
from mytable
group by id

【讨论】:

这似乎是正确的。谢谢你的解释。 @Dennon 我添加了一个简单的解决方案,当列已经有“IN”和“OUT”时。 我明白了。这就是 Yurify 的建议,并且有效。谢谢:) @Dennon 不,这与 Yurify 的建议不同。它可能会达到相同的结果,但我的 SQL 更易于阅读和编码并且执行速度更快。 确实如此。我可以通过您的查询获得确切的结果。非常感谢。【参考方案2】:
SELECT ID, CASE WHEN MAX(Status) = 1 THEN 'IN' 
ELSE 'OUT' END AS Status
FROM myTable
GROUP BY ID

基于评论

SELECT DISTINCT a.ID, COALESCE(b.Status, a.Status)
FROM myTable a LEFT JOIN myTable b ON a.ID = b.ID AND b.Status = 'IN'

【讨论】:

这行得通。谢谢。如果我在原始表中有 IN 或 OUT 而不是数值 0 和 1 怎么办? @Dennon 我冒险猜测这个变化。 @Dennon 简化和测试 我对 COALESCE 函数不熟悉。但是第一个查询似乎有效。谢谢 case when max(case when X in (<values to keep>) then 1 else 0 end = 1 then 'Match' else 'No Match' end

以上是关于根据列上的条件获取记录的单个值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据单个表中的两个列值获取 1 条记录?

在单个单元格中根据多个条件选择记录

Excel 2010 VBA:复制行,根据某列上的值动态选择它们

T-SQL 根据另一表列过滤一列上的多个值

Spark 以非连接列上的条件连接

PowerBI:根据 DATEDIFF 上的条件正确聚合度量