mysql - Mysql子查询中MAX的使用
问题描述
为什么我不能使用返回组错误的子查询?
SELECT hs.dateFin, hs.codeAdherent, hs.codeArticle
FROM hs
WHERE hs.codeFamilleArticle IN ('CNI', 'COT', 'ABO', 'ABOW',
'CNIW', 'O&T', 'EPH', 'TAX')
AND codeAdherent != 0
AND MAX(hs.dateFin) BETWEEN '2017-01-01'
AND '2017-12-31'
GROUP BY hs.codeAdherent
2018-01-01 和 2018-12-31 存在相同的数据,但我只想获得 2017 年结束的数据。这里是包含 140000 个原始数据的表格样本(未显示所有列)。
codeAdherent A 有 2018、2017、2016 年的数据。
codeAdherent B 有 2018 年、2017 年的数据
codeAdherent C 仅适用于 2017 年。
如果我在 2017 年进行选择,我会得到所有三个 codeAdherent,那么 MAX BETWEEN 将排除 A 和 B ......但这不起作用
解决方案
您可以使用NOT EXISTS
检查 2018 年是否不存在记录:
SELECT dateFin, codeAdherent, codeArticle
FROM hs AS t
WHERE codeFamilleArticle IN ('CNI', 'COT', 'ABO', 'ABOW', 'CNIW', 'O&T', 'EPH', 'TAX')
AND codeAdherent != 0
-- filter 2017 rows
AND dateFin >= '2017-01-01'
AND dateFin < '2018-01-01'
-- filter rows where 2018 data does not exist
AND NOT EXISTS (
SELECT 1
FROM hs
WHERE codeAdherent = t.codeAdherent
AND dateFin >= '2018-01-01'
)
推荐阅读
- lte - 使用 Lipa/Sipto 进行流量卸载
- java - 如何在 Java AWS 开发工具包中使用临时 AWS 密钥而不是 env 变量?
- r - R 重叠线图与 ggplot 与 x 轴上的分类变量
- php - 如何比较两个 CodeIgniter 查询结果
- reactjs - 无法在 webpack 中压缩成 gzip
- vue.js - vue.js 是否有类似 AngularJS 的 `ng-repeat-start` 的东西
- python - SQLAlchemy - “双重查询”的正确方法
- javascript - 如何在javascript中获取确切的源域地址
- spring - 如何为许多客户端进行 Spring-boot 配置
- vba - 返回部分匹配另一个条件的唯一值(Excel VBA)