Mysql Использование MAX в подзапросе - PullRequest
0 голосов
/ 22 октября 2018

Почему я не могу использовать этот подзапрос, который возвращает групповую ошибку?

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

codeAdherent C только за 2017 год.

Если я сделаю выбор в 2017 году, я получу все три codeAdherent, тогдаМАКСИМАЛЬНОЕ МЕЖДУ исключит А и В ... Но это не работает

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Вы не можете использовать агрегатные функции, такие как 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 
0 голосов
/ 22 октября 2018

Вы можете использовать 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'
)
0 голосов
/ 22 октября 2018

Вы можете сделать это так:

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