首页 > 解决方案 > 如果在进行 groupby 之前存在,如何获取值

问题描述

我有一个包含 ID 和类型的表,我想获取 ID 的不同行,但是,如果类型存在某个值,我想获取它。

例如:

ID 类型
1 无解答
1 已回答
1 无解答
2 无解答
3 已回答

如果某个 ID 至少存在一次,则应选择“ANSWERED”。

预期结果应如下所示:

ID 类型
1 已回答
2 无解答
3 已回答

提到该表包含数百万行,如何以有效的方式完成此操作?

标签: mysql

解决方案


一种方法是使用NOT EXISTS

SELECT DISTINCT t1.*
FROM tablename t1
WHERE t1.type = 'ANSWERED'
OR NOT EXISTS (SELECT 1 FROM tablename t2 WHERE t2.ID = t1.ID AND t2.type = 'ANSWERED')

或者,使用条件聚合:

SELECT ID, COALESCE(MAX(CASE WHEN type = 'ANSWERED' THEN type END), 'NOT ANSWERED') type
FROM tablename
GROUP BY ID

如果您的 MySql 版本是 8.0+,您可以使用FIRST_VALUE()窗口函数:

SELECT DISTINCT ID,
       FIRST_VALUE(type) OVER (PARTITION BY ID ORDER BY type = 'ANSWERED' DESC) type
FROM tablename

另一个唯一有效的解决方案是因为'ANSWERED'按字母顺序比'NOT ANSWERED'

SELECT ID, MIN(type) type
FROM tablename
GROUP BY ID

请参阅演示


推荐阅读