SQL - использовать плотность_группы и группировать по - PullRequest
0 голосов
/ 19 апреля 2020

У меня сложилось впечатление, что когда мы используем rank / row_number / dens_rank, мы НЕ можем использовать group by, но почему ниже logi c работает успешно

Select product, type, dense_rank() over (partition by type order by sum(sales) desc) as rnk 
From mytable 
Where date> dateadd(month, -3, getdate()) 
Group by product, type

Почему я могу заказать по сумме (продажи) в рамках функции ранга?

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Ваш запрос в основном эквивалентен:

select pt.*,
       dense_rank() over (partition by type order by total_sales desc) as rnk 
from (select product, type, sum(sales) as total_sales
      from mytable 
      where date > dateadd(month, -3, getdate()) 
      group by product, type
     ) pt;

То есть dense_rank() выполняется после GROUP BY.

Это полностью разрешено , Итак, ваше понимание того, что их нельзя использовать вместе, неверно. Тем не менее, есть ограничения. Ссылки в dense_rank() должны быть столбцами или выражениями, которые известны после GROUP BY.

Итак, это разрешено в вашей версии:

dense_rank() over (partition by type order by sum(sales) desc) as rnk 

но это не так:

dense_rank() over (partition by type order by sales desc) as rnk 

, поскольку sales (само по себе) недействительно после group by.

1 голос
/ 19 апреля 2020

Все столбцы, которые вы использовали в операторе select, он содержится либо в статистической функции, либо в выражении group by.

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

...