Может кто-нибудь объяснить, что partition by
делает ключевое слово, и дать простой пример его в действии, а также почему можно его использовать? У меня есть SQL-запрос, написанный кем-то другим, и я пытаюсь выяснить, что он делает.
Пример разбиения по:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
Примеры, которые я видел в Интернете, кажутся слишком глубокими.
sql
oracle
window-functions
Алекс Бердсли
источник
источник
Ответы:
Предложение
PARTITION BY
устанавливает диапазон записей, которые будут использоваться для каждой «ГРУППЫ» вOVER
предложении.В вашем примере SQL
DEPT_COUNT
будет возвращать количество сотрудников в этом отделе для каждой записи сотрудника. (Это похоже на то, как будто вы отменяете нумерациюemp
таблицы; вы все равно возвращаете каждую запись вemp
таблице.)Если бы был другой столбец (например,
state
), то вы могли бы посчитать, сколько департаментов в этом штате.Это похоже на получение результатов
GROUP BY
(SUM
,AVG
и т. Д.) Без агрегирования набора результатов (т. Е. Удаления соответствующих записей).Это полезно, когда вы используете функции
LAST OVER
илиMIN OVER
для получения, например, самой низкой и самой высокой зарплаты в отделе, а затем используете ее при расчете по этой зарплате без учета дополнительного выбора, что намного быстрее.Прочитайте связанную статью AskTom для получения дополнительной информации.
источник
last over
иmin over
. Я полагаю, что дополнительный выбор будет медленнее, но английская грамматика в ответе не предполагает этого.Концепция очень хорошо объясняется принятым ответом, но я обнаружил, что чем больше примеров увидишь, тем лучше они будут погружены. Вот дополнительный пример:
1) Босс говорит: «Получите мне количество товаров, имеющихся у нас на складе, сгруппированных по брендам»
Вы говорите : «Нет проблем»
Результат:
2) Босс говорит: «Теперь достань мне список всех предметов с указанием их бренда И количества предметов, которые есть у соответствующего бренда»
Вы можете попробовать:
Но вы получаете:
Вот где
OVER (PARTITION BY BRAND)
приходит:Что означает:
COUNT(ITEM_ID)
- получить количество предметовOVER
- над множеством рядов(PARTITION BY BRAND)
- которые имеют ту же маркуИ результат:
и т.д...
источник
Это расширение SQL называется аналитикой. «Over» в операторе select говорит оракулу, что функция является аналитической функцией, а не группой по функции. Преимущество использования аналитики состоит в том, что вы можете собирать суммы, числа и многое другое всего за один проход данных вместо того, чтобы циклически перебирать данные с помощью подвыборок или, еще хуже, PL / SQL.
Поначалу это выглядит странно, но это быстро станет второй натурой. Никто не объясняет это лучше, чем Том Кайт. Так что ссылка выше отличная.
Конечно, чтение документации обязательно.
источник
Здесь мы рассчитываем на соответствующую дептно. Что касается 10, у нас есть 4 записи в таблице emp, аналогичные результаты также для 20 и 30.
источник
ключевое слово over partition выглядит так, как будто мы разделяем данные с помощью client_id, создавая подмножество каждого идентификатора клиента
этот запрос вернет количество операций, выполненных client_id
источник
Я думаю, этот пример предлагает небольшой нюанс о том, как работает разбиение и как работает группировка по. Мой пример взят из Oracle 12, если мой пример - ошибка компиляции.
Я попытался :
Это, однако, работает как ожидалось:
Создание количества элементов в каждом состоянии на основе внешнего ключа «data_key». Таким образом, если бы data_key = 'APPLE' имел 3 строки с состоянием 'A', 2 строки с состоянием 'B', строку с состоянием 'C', соответствующая строка для 'APPLE' была бы 'APPLE', 3, 2 1, 6.
источник