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