2016-08-22 3 views
1

Я пытаюсь выбрать логическое значение, где order.lastUpdated старше, чем 30 минут назад, но я получаю сообщение об ошибке:MySQL Неправильное использование функции группы с максимальным()

SQL state [HY000]; error code [1111]; Invalid use of group function; nested exception is java.sql.SQLException: Invalid use of group function

Вот запрос:

select 
c.externalReference channelReference, 
c.id channelId, 
max(o.lastUpdated) lastUpdated, 
sum(if(max(o.lastUpdated) < date_sub(now(), interval 30 minute), 0, 1)) beforeThreshold 
from channel c 
join order_item o on c.id = o.channelId 
where date(o.lastUpdated) = date(now()) 
and o.lastUpdated > date_sub(now(), interval 1 hour) 
group by c.externalReference; 

Как я могу вернуть булево значение, если o.lastUpdated старше 30 минут назад, когда я должен использовать max()?

+1

первая попытка группы по c.externalReference, c.id и посмотреть, если это делает никакой разницы – Moptan

+0

я все еще получаю ту же ошибку. – crm

+2

Вы не можете вложить агрегированные функции ('sum (max)'), 'max' нужно сделать в производной таблице и' sum' поверх нее. – dnoeth

ответ

1

Вы не можете встраивать функции агрегации, такие как SUM() и MAX(). Вы должны сделать внутреннюю в подзапросе.

SELECT c.externalReference AS channelReference, 
     c.id AS ChannelId 
     o.lastUpdated, 
     SUM(IF(o.lastUpdated < DATE_SUB(NOW(), INTERVAL 30 MINUTE), 0, 1) AS beforeThreshold 
FROM channel AS c 
JOIN (SELECT channelId, MAX(lastUpdated) AS lastUpdated 
     FROM order_item 
     WHERE DATE(lastUpdated) = TODAY() 
     AND lastUpdated > DATE_SUB(NOW(), INTERVAL 1 HOUR) 
     GROUP BY channelId) AS o 
ON c.id = o.channelId 
GROUP BY c.externalReference 
Смежные вопросы