Когда я начал играть с SQLite, я заметил, что GROUP BY позволяет вам исключить неагрегированные термины.Пример:
SELECT month, category, max(quantity)
from Table1
GROUP BY month;
Это даст мне вывод, где я получу max(quantity)
в месяц, но затем я также получу значение для category
.
Что такое category
на самом деле дает мне?Дает ли мне категорию, которая соответствует максимальному (количеству) за месяц (что я обычно должен был бы выполнить с помощью самостоятельного объединения)?Или это совершенно произвольно (и если это совершенно произвольно, почему бы мне просто не дать мне ошибку, вместо того, чтобы позволить мне думать, что мой запрос работает ???)?
Я бы проигнорировал тот факт, что он позволяет мнесделайте это как упущение, за исключением того, что я нашел этот учебник , который выглядит так, как будто он использует тот факт, что вы можете исключить термины из группы (если я не неправильно понимаю учебник).
РЕДАКТИРОВАТЬ Я также только что попробовал это и обнаружил, что два следующих запроса дают мне точно такой же вывод:
Оба запроса ищут максимальное значение (update_at) для cust_id, а затем также выводят сегмент этогоcust_id.
Запрос 1 (с использованием самостоятельного объединения):
SELECT seg.cust_id, seg.seg_name, temp.max_update
FROM segments as seg
INNER JOIN
(
SELECT cust_id, MAX(update_at) AS max_update
FROM segments
WHERE DATE(update_at) <= "2016-03-01"
GROUP BY cust_id
) as temp
ON
seg.cust_id = temp.cust_id AND
seg.update_at = temp.max_update;
Глупый запрос SQLite (с использованием "причуды" SQLite):
SELECT cust_id,seg_name, MAX(update_at)
FROM segments
WHERE DATE(update_at) <= "2016-03-01"
GROUP BY cust_id;
Так это просто совпадение, что они дают одинаковые результаты?Или я что-то упустил?Я неоднократно запускал вторую версию, чтобы посмотреть, даст ли она разные результаты, и каждый раз она дает одинаковые результаты.