Существует ли более элегантный способ применения вложенного ранжирования по нескольким различным столбцам, отсортированным по итогу самого левого столбца, а затем по итогу в этой группе?Я предоставляю снимок экрана: образец структуры данных и желаемое состояние.
Сейчас я использую три разных запроса (сначала ранжирование региона по его общему количеству, затем второй по общему состоянию и т. Д.).и третий по городу) Поддерживать это очень сложно, особенно если мне нужно изменить порядок ранжирования, а также окно даты.(«Продажи по месяцам», «Продажи по годам» и т.бороться.
Для тех, кому интересно, я делаю ранжирование в SQL вместо Tableau, потому что почти невозможно смешать ранжирование с вложенным Top N + Other, настроенным с помощью оконной функции Tableau или LOD.
To">
CREATE TABLE RankingTest (
Region NVarChar(15),
[State] NVarChar(2),
City NVarChar(50),
Sales Int
);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('East','NY','New York',32);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('East','NY','New York',3);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('East','NY','Queens',4);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('East','MA','Boston',6);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('East','FL','Miama',7);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','WA','Seattle',13);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','WA','Bellevue',6);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','WA','Kirkland',8);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','OR','Portland',11);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','OR','Salem',3);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','CA','San Franscisco',6);
INSERT INTO RankingTest (Region, [state], city, Sales) Values ('West','CA','San Franscisco',9);
Текущий запрос:
WITH RegionRank AS (
SELECT Region,
DENSE_RANK() OVER (ORDER By SUM(Sales) DESC) AS Rank,
SUM(Sales) AS Sales
FROM RankingTest
GROUP BY Region
),
StateRank AS (
SELECT RT.Region, State,
DENSE_RANK() OVER (PARTITION BY RR.Rank ORDER BY RR.Rank, SUM(RT.Sales) DESC) AS Rank,
SUM(RT.Sales) AS Sales
FROM RankingTest RT LEFT JOIN RegionRank RR ON RT.Region = RR.Region
GROUP BY RT.Region, RR.Rank, State
),
CityRank AS (
SELECT RT.Region, RR.Rank RegionRank, RR.Sales RegionSales, RT.State,
SR.Rank StateRank, SR.Sales StateSales, City,
DENSE_RANK() OVER (PARTITION BY RR.Rank, SR.Rank ORDER BY RR.Rank, SR.Rank, SUM(RT.Sales) DESC) AS
Rank,
SUM(RT.Sales) AS Sales
FROM RankingTest RT
LEFT JOIN RegionRank RR ON RT.Region = RR.Region
LEFT JOIN StateRank SR ON RT.Region = SR.Region AND RT.State = SR.State
GROUP BY RT.Region, RR.Rank, RR.Sales, RT.State, SR.Rank, SR.Sales, City
)
SELECT * FROM CityRank
SQL Fiddle