Предложение GROUP BY
не является избыточным - его функция заключается в определении области, в которой работают агрегатные функции.Вы полагаете, что оптимизатор должен прочитать из предложения SELECT, чтобы узнать, какова область группировки, но доступ к псевдонимам столбцов доступен в предложении ORDER BY
в ближайшее время (за исключением MySQL, где GROUP BY
и HAVING
пункты поддерживают псевдонимы столбцов).Там нет средств, чтобы поддержать ваши ожидания, в настоящее время.Стандарты ANSI хороши, но реальность такова, что стандарты ANSI не полностью реализованы поставщиками.Это поддержка поиска и проверки, например, PostgreSQL 8.4+ поддерживает больше аналитических функций, чем Oracle (конечно, больше, чем SQL Server).
MySQL и SQLite поддерживают опускание столбцов из GROUP BY
, но значения этих столбцовдокументация, произвольная - значение не может быть гарантировано возвращено последовательно.И область группировки также отличается, что может существенно повлиять на возвращаемый набор результатов.Кроме того, существует проблема использования специфического синтаксиса поставщика при необходимости портирования на другие базы данных, поскольку DB2, Oracle, SQL Server и PostgreSQL не поддерживают эту функциональность.
Но с появлением аналитической / оконной / ранжирующей функциональности вы можете получить совокупную функциональность без GROUP BY.IE:
SELECT t.id,
COUNT(t.column) OVER(PARTITION BY t.id) AS num,
SUM(t.column) OVER(PARTITION BY t.id) AS sum
FROM YOUR_TABLE t
Это более многословно и подвержено ошибкам, потому что вы не можете определить PARTITION BY
/ ORDER BY
, который применяется ко всем аналитическим функциям в запросе.В настоящее время ... Но Analytics не будет вытеснять агрегаты в ближайшее время - поддержка началась в Oracle 9i, SQL Server 2005+ и PostgreSQL 8.4+.Мне известно, что DB2 поддерживает аналитику, но я не знаю подробностей.