【问题标题】: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。我现在已经添加了标签。

标签: mysql sql


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多