Ранг зависит от groupby, почему

Недавно я видел запрос, подобный приведенному ниже (ранг, плотное_ранг, с предложением group by). Я обнаружил, что предложение group by заставляет ранг вести себя как плотный ранг, и не смог найти документацию Microsoft об этом.

with FactTransactionHistory as
(
select 2 as ProductKey,'abc1' as trx
union
select 3 as ProductKey,'abc1' as trx
union
select 4 as ProductKey,'abc' as trx
union
select 4 as ProductKey,'abc2' as trx
union
select 4 as ProductKey,'abc3' as trx
union
select 5 as ProductKey,'abc' as trx
)
select ProductKey, DENSE_RANK() over(order by ProductKey) rowNumDense, RANK() over(order by ProductKey) rowNum
/*, count(*) recordCount*/
from FactTransactionHistory
group by ProductKey

Насколько я понимаю, если у over clause есть partition by, он будет упорядочен внутри раздела, поэтому значение ранга определяется внутри раздела. Но в этом запросе нет partitition by, поэтому order by присутствует во всем наборе данных, и я не мог объяснить о функции ранжирования, почему она ведет себя как плотное ранг. Не могли бы вы помочь объяснить, почему?

Примечание: если я удалю предложение group by, rank и плотное_ранг будут показывать другое значение, как указано в документации.

Где RANK ведет себя как DENSE_RANK? В единственном наборе данных они будут отличаться, RANK (который вы ошибочно назвали rowNum) дает результат, отличный от DENSE_RANK.

Thom A 15.12.2020 15:10

Обе оконные функции работают с набором данных, полученным после применения группировки. Итак, когда присутствует предложение GROUP BY, «весь набор данных» — это набор данных с разными значениями ProductKey.

Giorgos Betsos 15.12.2020 15:12
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
136
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я обнаружил, что пункт group by заставляет rank вести себя как dense rank.

Эти две функции ранжирования отличаются только тем, как они обрабатывают ничьи. Здесь вы заказываете предложение over() оконной функции с тем же столбцом, который используется в group by, то есть ProductKey. По своей природе агрегирование гарантирует отсутствие дубликатов ключа продукта, поэтому обе функции дают одинаковый результат.

Но в этом запросе нет partition by, поэтому order by есть во всем наборе данных.

Это место, где ваши ожидания не оправдываются. Чтобы процитировать документы по предложению OVER

Если PARTITION BY не указан, функция обрабатывает все строки набора результатов запроса как одну группу.

Мой акцент. Именно строки результирующего набора, а не исходные строки, составляют здесь единый раздел.

Другие вопросы по теме