Over by partition: Предложение OVER (Transact-SQL) — SQL Server

Что делает SQL PARTITION BY?

4 комментария
/ Последнее обновление: 26 сентября 2022 г.

Вы когда-нибудь видели ключевое слово PARTITION BY, используемое в запросах SQL? Если да, то знаете ли вы, что он делает и как его использовать? Узнайте о ключевом слове SQL PARTITION BY и посмотрите несколько примеров в этой статье.

Содержание

Что такое ключевое слово SQL PARTITION BY?

PARTITION BY — это ключевое слово, которое можно использовать в агрегированных запросах SQL, таких как SUM и COUNT.

Это ключевое слово, наряду с ключевым словом OVER, , позволяет указать диапазон записей, которые используются для каждой группы в рамках функции .

Это немного похоже на предложение GROUP BY, но немного отличается.

 

Простой пример PARTITION BY

Давайте рассмотрим пример.

Предположим, у нас есть таблица предметов, определяющая информацию о предметах для школы. У них был учитель_ид, который ссылался на учителя этого предмета.

Допустим, вы хотите найти идентификаторы предметов, идентификаторы учителей и количество предметов, которые преподает учитель, используя COUNT.

 ВЫБОР
subject_id,
учитель_id,
COUNT(*) OVER (РАЗДЕЛ ПО ИД_учителя) КАК УЧИТЕЛЬ_СЧЕТ
ОТ предмета; 

Результат:

SUBJECT_ID УЧИТЕЛЬ_ID УЧИТЕЛЬ_COUNT
1 14 1
2 8 1
3 9 1
4 12 1
5 21 2
6 21 2

В этой таблице показаны все значения subject_id и Teacher_id. Он также показывает учителя_счет, который представляет собой количество предметов для каждого учителя для каждой строки.

Вы можете видеть, что в нескольких последних записях значение Teacher_count равно 2, потому что есть 2 записи с этим id_учителя. Значение повторяется для этой строки.

Другие записи, которые имеют другое значение для Teacher_id, имеют другое значение счетчика.

Это похоже на то, как если бы вы выполняли агрегатную функцию для набора записей, но без агрегирования всего набора результатов.

 

Почему бы не использовать подзапрос?

Конечно, вы также можете использовать подзапрос для получения тех же результатов. Однако подзапрос будет:

  • Медленнее (вероятно)
  • Труднее писать

Как бы вы сделали это в подзапросе?

 ВЫБОР
s.subject_id,
s.teacher_id,
sub.teacher_count
ОТ предмета s
ВНУТРЕННЕЕ СОЕДИНЕНИЕ (
  ВЫБРАТЬ
  учитель_id,
  COUNT(*) КАК СЧЕТ_учителей
  ОТ предмета
  СГРУППИРОВАТЬ ПО ИД_учителя)
sub ON sub. teacher_id = s.teacher_id
ЗАКАЗАТЬ ПО s.teacher_id, s.subject_id; 

Результат:

SUBJECT_ID УЧИТЕЛЬ_ID УЧИТЕЛЬ_COUNT
1 14 1
2 8 1
3 9 1
4 12 1
5 21 2
6 21 2

Как видите, результаты те же, но запрос длиннее. Он также может работать медленнее, потому что вы просматриваете таблицу дважды (один раз во внешнем запросе и один раз во внутреннем запросе, который к ней присоединен), а не только один раз.

 

Почему следует использовать PARTITION BY вместо GROUP BY?

Мы можем попробовать использовать обычный запрос с GROUP BY, чтобы получить те же результаты.

 ВЫБОР
subject_id,
учитель_id,
СЧИТАТЬ(*)
ОТ предмета
СГРУППИРОВАТЬ ПО ИД_субъекта, ИД_учителя; 

Результат:

SUBJECT_ID УЧИТЕЛЬ_ID СЧЕТ(*)
1 14 1
2 8 1
3 9 1
4 12 1
5 21 1
6 21 1

Вы можете видеть, что для каждой записи есть значение 1. Это связано с тем, что COUNT подсчитывает количество уникальных пар предмета и учителя, и они всегда уникальны.

Как насчет того, чтобы изменить GROUP BY на группу только по учителю?

 ВЫБОР
subject_id,
учитель_id,
СЧИТАТЬ(*)
ОТ предмета
СГРУППИРОВАТЬ ПО ИД_учителя; 

Результат (если мы запустим это в Oracle):

 ORA-00979: не выражение GROUP BY 

Эта ошибка возникает из-за того, как работает GROUP BY. Вам нужно указать каждый столбец в предложении SELECT, который не является агрегатной функцией.

Итак, мы видим, что использование GROUP BY не даст нам желаемого результата. Для этой цели мы можем использовать подзапрос (как мы делали ранее) или использовать ключевое слово PARTITION BY.

 

Заключение

Надеюсь, это ответит на ваши вопросы о ключевом слове SQL PARTITION BY и о том, как его использовать.

У вас есть вопросы по ключевому слову PARTITION BY? Оставьте их в разделе комментариев ниже.

Наконец, если вам понравилась информация и советы по карьере, которые я предоставляю, подпишитесь на мою рассылку ниже , чтобы быть в курсе моих статей. Вы также получите фантастический бонус. Спасибо!

MySQL | РАЗДЕЛ ПО ПУНКТУ

  • Прочитать
  • Обсудить
  • Практика
  • Видео
  • Курсы
  • Улучшить статью

    Сохранить статью

    Предложение PARTITION BY используется для разделения строк таблицы на группы. Это полезно, когда нам нужно выполнить расчет для отдельных строк группы, используя другие строки этой группы.

    • Всегда используется внутри предложения OVER().
    • Раздел, образованный пунктом раздела, также известен как Окно .
    • Этот пункт работает только с функциями Windows. Например, RANK(), LEAD(), LAG() и т. д.
    • Если это предложение опущено в предложении OVER(), вся таблица рассматривается как один раздел.

    Синтаксис:
    Синтаксис для предложения Partition:

     Window_function ( выражение )
           Over ( раздел по выражению [order_clause] [frame_clause] )
     

    Здесь order_clause и frame_clause необязательны.

    expr может быть именем столбца или встроенными функциями в MySQL.

    Но стандартный SQL допускает только имена столбцов в expr.

    Examples:

    Consider, a table “ Hacker “:

    h_id h_name challenge_id score
    3 shubh 111 20
    2 ааюш 111 80
    5 krithik 112 40
    5 krithik 114 90
    4 tushar 112 30
    1 parth 112 40

    Нам нужно найти ранг хакеров в каждом испытании. Это означает, что мы должны перечислить всех участвовавших в испытании хакеров вместе с их рангом в этом испытании.