Я использовал GROUP BY
для всех типов совокупных запросов на протяжении многих лет. Недавно я провел обратный инжиниринг кода, который используется PARTITION BY
для агрегации. Прочитав всю документацию, которую я могу найти PARTITION BY
, это звучит очень похоже GROUP BY
, может быть, с добавлением немного дополнительной функциональности? Это две версии одного и того же общего функционала или они что-то совершенно другое?
366
Мы можем взять простой пример.
Рассмотрим таблицу с именами
TableA
со следующими значениями:GROUP BY
Синтаксис:
Мы можем применить
GROUP BY
в нашей таблице:Результаты:
В нашей реальной таблице у нас есть 7 строк, и когда мы применяем
GROUP BY id
, сервер группирует результаты на основеid
:Простыми словами:
PARTITION BY
Прежде чем перейти к PARTITION BY, давайте посмотрим на
OVER
предложение:Согласно определению MSDN:
PARTITION BY не уменьшит количество возвращаемых строк.
Мы можем применить PARTITION BY в нашем примере таблицы:
Результат:
Посмотрите на результаты - он разделит строки и вернет все строки, в отличие от GROUP BY.
источник
partition by
может повлиять на количество строк, просто не уменьшит количество строк.SELECT
наSELECT DISTINCT
второй запрос? не вернет ли это тот же набор данных, что иGROUP BY
запрос? Каковы причины выбора одного или другого?partition by
на самом деле не свернуть данные. Это позволяет вам сбросить что-то для каждой группы. Например, вы можете получить порядковый столбец в группе, разделив поле группировки и используяrownum()
строки в этой группе. Это дает вам нечто похожее на столбец идентификаторов, который сбрасывается в начале каждой группы.источник
Найдено по этой ссылке: OVER Clause
источник
Предоставляет свернутые данные без свертывания
т.е. предположим, что я хочу вернуть относительную позицию региона продаж
Используя PARTITION BY, я могу вернуть сумму продаж для данного региона и максимальную сумму для всех регионов продаж в одной строке.
Это означает, что у вас будут повторяющиеся данные, но они могут подойти конечному потребителю в том смысле, что данные были агрегированы, но данные не были потеряны - как в случае с GROUP BY.
источник
PARTITION BY
аналитичен, аGROUP BY
агрегатен. Чтобы использоватьPARTITION BY
, вы должны содержать его с предложением OVER .источник
PARTITION BY is analytic
это простое утверждение многое прояснило для меня. +1.Насколько я понимаю, раздел By почти идентичен группе By, но со следующими отличиями:
Эта группа фактически группирует результирующий набор, возвращая по одной строке на группу, что приводит к тому, что SQL Server допускает только агрегированные функции списка SELECT или столбцы, которые являются частью предложения group by (в этом случае SQL Server может гарантировать, что существуют уникальные результаты для каждой группы).
Рассмотрим, например, MySQL, который позволяет иметь в списке SELECT столбцы, которые не определены в предложении Group By, и в этом случае по-прежнему возвращается одна строка на группу, однако, если столбец не имеет уникальных результатов, гарантия не гарантируется. какой будет выход!
Но с Partition By, хотя результаты функции идентичны результатам агрегатной функции с Group By, вы все равно получаете нормальный набор результатов, что означает, что каждый получает одну строку на базовую строку, а не одну строку на group, и из-за этого в списке SELECT могут быть столбцы, которые не являются уникальными для каждой группы.
Таким образом, в качестве резюме, Group By будет лучше, когда требуется вывод по одной строке на группу, а Partition By будет лучше, когда нужны все строки, но при этом требуется агрегатная функция, основанная на группе.
Конечно, могут также быть проблемы с производительностью, см. Http://social.msdn.microsoft.com/Forums/ms-MY/transactsql/thread/0b20c2b5-1607-40bc-b7a7-0c60a2a55fba .
источник
Когда вы используете
GROUP BY
, результирующие строки будут обычно меньше входящих строк.Но, когда вы используете
PARTITION BY
, результирующий счетчик строк должен быть таким же, как и входящий.источник
Предположим, у нас есть 14 записей
name
столбца в таблицев
group by
это даст счет в одном ряду т.е. 14
но в
partition by
это будет 14 рядов увеличения количества
источник
Небольшое наблюдение. Механизм автоматизации для динамической генерации SQL с использованием «разбиения по» гораздо проще реализовать по отношению к «группированию по». В случае «group by», мы должны позаботиться о содержимом столбца «select».
Извините за мой английский.
источник
У него действительно разные сценарии использования. Когда вы используете GROUP BY, вы объединяете некоторые записи для одинаковых столбцов, и вы получаете совокупность результирующего набора.
Однако, когда вы используете PARTITION BY, ваш набор результатов такой же, но у вас просто агрегирование по оконным функциям, и вы не объединяете записи, у вас все равно будет такое же количество записей.
Вот полезная статья, объясняющая разницу: http://alevryustemov.com/sql/sql-partition-by/
источник
источник