1

有没有一种更优雅的方法可以在几个不同的列上应用嵌套排名,按最左列的总数排序,然后按该组内的总数排序?我正在提供屏幕截图:示例数据结构和所需状态。

现在,我正在使用三个不同的查询(首先按其总数对地区进行排名。然后,按州总数等第二个,第三个按城市)维护起来很痛苦,特别是如果我需要修改排名的顺序以及日期窗口。(想想月销售额、年初至今销售额等)

使用 RANK 和 windows 函数和分区,我可以相当容易地获得区域内的城市排名,但要获得州排名和地区排名我开始挣扎。

对于那些好奇的人,我在 SQL 而不是 Tableau 中进行排名,因为几乎不可能将排名与嵌套的 Top N + Other 设置与 Tableau 窗口函数或 LOD 混合。

从 ---> 到

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小提琴

4

1 回答 1

1

嵌套查询应该可以解决问题:

SELECT *,
    DENSE_RANK() OVER( ORDER BY SalesRegion DESC ) AS RankRegion,
    DENSE_RANK() OVER( PARTITION BY Region ORDER BY SalesState DESC ) AS RankState,
    DENSE_RANK() OVER( PARTITION BY Region, State ORDER BY SalesCity DESC ) AS RankCity
FROM(
    SELECT DISTINCT Region, State, City,
        SUM( Sales ) OVER( PARTITION BY city, State, Region ) as SalesCity,
        SUM( Sales ) OVER( PARTITION BY State, Region ) as SalesState,
        SUM( Sales ) OVER( PARTITION BY Region ) as SalesRegion
    FROM RankingTest ) AS DistinctSales
ORDER BY RankRegion, RankState, RankCity

请注意,DISTINCT Region, State, City充当GROUP BY此处。

于 2019-06-25T05:35:17.463 回答