mysql - 如果在进行 groupby 之前存在,如何获取值
问题描述
我有一个包含 ID 和类型的表,我想获取 ID 的不同行,但是,如果类型存在某个值,我想获取它。
例如:
ID | 类型 |
---|---|
1 | 无解答 |
1 | 已回答 |
1 | 无解答 |
2 | 无解答 |
3 | 已回答 |
如果某个 ID 至少存在一次,则应选择“ANSWERED”。
预期结果应如下所示:
ID | 类型 |
---|---|
1 | 已回答 |
2 | 无解答 |
3 | 已回答 |
提到该表包含数百万行,如何以有效的方式完成此操作?
解决方案
一种方法是使用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
请参阅演示。
推荐阅读
- css - 造型
在父元素内 - c# - 在 odata v4 中返回包含多个实体类型的列表(类似于 $all)
- tfs - TFS 2017 测试模板上的语言混合 - 为什么?
- apache-spark - SparkThriftServer 在 11 天后崩溃
- python - 为什么 pytest 一旦单元测试(@pytest.mark.timeout(3))超时就退出?
- mongodb - MongoDB:多处理更新和“$inc”操作
- r - 如何使用cowplot包在R中的同一页面上制作多个图?
- visual-studio - 无法安装 Xamarin.Firebase.Messaging 包
- ios - 在我的表格视图中,我没有只有单元格的部分,所以如何在 ios 目标 c 中重新加载表格视图?
- django - 使用序列化程序将多个数据添加到模型中