Использование функции MAX в соединении - PullRequest
2 голосов
/ 13 сентября 2011

У меня проблемы с получением правильного SQL. Между таблицами iPad и statlog существует отношение один ко многим, и я хочу выбрать statlog с наибольшим значением.

Моим первым решением было включить вложенный SELECT, который захватил для меня значение MAX, но, поскольку это заняло лот времени, я вынужден переписать его.

SELECT 
  ipad.udid, 
  ipad.state, 
  statelog.new_state 
FROM 
  ipad 
LEFT OUTER JOIN 
  statelog 
ON 
  ipad.udid = statelog.udid 
WHERE 
  ipad.airid=250033
  AND 
  statelog.new_state = MAX(statelog.new_state) 

Этот SQL не работает, но показывает мое намерение.

1 Ответ

6 голосов
/ 13 сентября 2011

Как то так будет работать

SELECT ipad.udid, ipad.state, max(statelog.new_state)
FROM ipad  
  LEFT OUTER JOIN statelog ON ipad.udid = statelog.udid  
WHERE ipad.airid=250033
GROUP BY ipad.udid, ipad.state

MAX и другие агрегатные функции в SQL (min, sum, count, Среднее и т. Д.) Работают с группами значений. Объединение генерирует одну строку для каждого журнала состояний для каждого ipad, поэтому, если у вас есть 10 ipad с 8 журналами состояния в каждом, вы получите 80 строк. Group by группирует эти 80 строк для каждого ipad (их столбцы ipad.udid и ipad.state одинаковы), и в области действия этой группы используется max(statelog.new_state) для извлечения максимального состояния.

...