mysql在子查询中使用max

ubof19bj  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(297)

为什么我不能使用返回组错误的子查询?

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个raw的表示例(并非所有列都显示)。

CODEA有2018、2017、2016年的数据。
CODEB拥有2018年、2017年的数据
CODEC仅适用于2017年。
如果我在2017年做了一个选择,我得到了所有的三个代码,那么之间的最大值将排除a和b。。。但这是行不通的

epfja78i

epfja78i1#

不能使用聚合函数,如 Max() 内部 Where 条款。您只需修改 where 条件仅包括2017年的日期,然后确定 Max() 分组依据后的日期。

SELECT MAX(hs.dateFin), hs.codeAdherent, hs.codeArticle 
FROM hs 
WHERE hs.codeFamilleArticle IN ('CNI', 'COT', 'ABO', 'ABOW',
                                'CNIW', 'O&T', 'EPH', 'TAX') 
AND hs.codeAdherent != 0 
WHERE hs.dateFin BETWEEN '2017-01-01' 
                     AND '2017-12-31'
GROUP BY hs.codeAdherent, hs.codeArticle
xtfmy6hx

xtfmy6hx2#

你可以用 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'
)
jtjikinw

jtjikinw3#

你可以这样做:

HAVING YEAR(MAX(hs.dateFin)) = 2017

相关问题