SQL-сервер:10 лучших продавцов за неделю — и предыдущие рейтинги
-
21-09-2019 - |
Вопрос
select *
from
(
select year,
week,
salesperson,
count(*) as transactions,
rank() over(partition by week order by count(*) desc) as ranking
from sales
where year = '2010',
group by year,
week,
salesperson
) temp
where ranking <= 10
Запрос возвращает список 10 лучших продавцов (по количеству транзакций) за каждую неделю года.
Как добавить столбцы в результаты для:
- Рейтинг на предыдущей неделе для этого продавца
- Всего недель в Топ-10 в этом году
- Недели подряд в Топ-10 (начиная с первой недели)
- Недели подряд в Топ-10 (если возможно, начиная с предыдущего года)
Можете ли вы дать какой-нибудь общий совет, как решать подобные проблемы?
ПС:Использование SQL-сервера 2008.
Решение
Мой совет - выполнить другие запросы отдельно в взглядах, а затем присоединиться к ним Салеперсон (что, я полагаю, является ключом)
Логика в том, что этот запрос хороший, чистый и легко следуя. В противном случае - я думаю, что способ атаковать это было бы, чтобы начать писать функции TSQL для расчета других значений, но я думаю, что эти функции в любом случае будут иметь запросы в них в любом случае.
Другие советы
На самом деле, я не уверен, что просмотры — лучший способ.Вы можете реализовать такую логику в CTE и объединить все это в один запрос.Например, вот что у меня есть для всего, кроме последовательной логики:
;With
SalesDateParts As
(
Select DatePart(wk, SaleDate) As WeekNum, DatePart(yy, SaleDate) As [Year], SalesPersonId
From #Sales
)
, SalesByWeek As
(
Select [Year], WeekNum, SalesPersonId, Count(*) As SaleCount
, RANK() OVER( PARTITION BY [Year], [WeekNum] ORDER BY Count(*) DESC ) As SaleRank
From SalesDateParts
Group By [Year], WeekNum, SalesPersonId
)
, PrevWeekTopSales As
(
Select [Year], [WeekNum], SalesPersonId, SaleCount
From SalesByWeek
Where [Year] = DatePart(yyyy, DateAdd(d, -7, CURRENT_TIMESTAMP))
And WeekNum = DatePart(wk, DateAdd(d, -7, CURRENT_TIMESTAMP))
)
, WeeksInTop10 As
(
Select SalesPersonId, Count(*) As Top10Count
From SalesByWeek
Where SaleRank <= 10
Group By SalesPersonId
)
Select *
From Salespersons
Left Join WeeksInTop10
On WeeksInTop10.SalesPersonId = SalesPersons.SalesPersonId
Left Join PrevWeekTopSales
On PrevWeekTopSales.SalesPersonId = SalesPersons.SalesPersonId
Логика «последовательного», вероятно, потребует таблицы календаря, которая содержит значение для каждого дня, а также столбцы для года и недели данной даты.