Mysql在子查询中使用MAX

时间:2018-10-22 17:46:58

标签: 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个原始数据(未显示所有列)。

Here

codeAdherent A具有2018、2017、2016的数据。

codeAdherent B具有2018年,2017年的数据

仅适用于2017年的代码Adherent C。

如果我在2017年进行选择,我会获得所有三个代码都遵循,那么MAX BETWEEN将排除A和B ...但这是行不通的

3 个答案:

答案 0 :(得分:1)

您可以使用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'
)

答案 1 :(得分:0)

您可以这样做:

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

答案 2 :(得分:0)

您不能在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