Оставить термины из GROUP BY в SQLite? - PullRequest
0 голосов
/ 25 августа 2018

Когда я начал играть с 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;

Так это просто совпадение, что они дают одинаковые результаты?Или я что-то упустил?Я неоднократно запускал вторую версию, чтобы посмотреть, даст ли она разные результаты, и каждый раз она дает одинаковые результаты.

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

SQLite допускает использование пустых столбцов в совокупных запросах для совместимости с MySQL. Вы получаете значения из некоторой случайной строки в группе , так что это полезно, только если вы знаете, что эти значения на самом деле одинаковы в группе.

Однако в вашем случае применяется расширение :

Когда агрегатные функции min () или max () используются в агрегированном запросе, все пустые столбцы в наборе результатов получают значения из строки ввода, которая также содержит минимум или максимум.

Так что ваш запрос гарантированно будет работать.

0 голосов
/ 25 августа 2018

С «ВЫБОР», «3. Генерация набора строк результатов» :

  • (...) Каждое выражение в наборе результатовЗатем оценивается один раз для каждой группы строк.Если выражение является агрегатным выражением, оно оценивается по всем строкам в группе.В противном случае он оценивается по одной произвольно выбранной строке внутри группы.Если в наборе результатов имеется более одного неагрегированного выражения, все такие выражения оцениваются для одной и той же строки.(...)

Итак, да, вы получаете только значения из случайно выбранной строки в группе.

И почему это так?Ну, вероятно, потому что дизайнеры / программисты SQLite решили сделать это таким образом.Возможно, потому что это проще и / или они не думали, что это так важно.Как люди MySQL, кстати.Там тоже самое, по крайней мере, в младших версиях или с некоторыми настройками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...