Tsql 组合分组和排名的正确方式是什么?

Tsql 组合分组和排名的正确方式是什么?,tsql,sql-server-2008-r2,Tsql,Sql Server 2008 R2,在下面的查询中,我已经有了一个逐日细分的视图 现在,我想对其进行过滤,这样,如果其活动在前10个创收活动中,结果中将包含一行 我得到了我想要的,但我有一种感觉,在这个过程中,我可能跳过了显而易见/正确的方法 WITH T AS ( SELECT ByDay.[Day] ,ByDay.[Campaign Name] ,ByDay.[Revenue USD] FROM ByDay WHERE ByDay.[Period]='Mar 2012' ),

在下面的查询中,我已经有了一个逐日细分的视图

现在,我想对其进行过滤,这样,如果其活动在前10个创收活动中,结果中将包含一行

我得到了我想要的,但我有一种感觉,在这个过程中,我可能跳过了显而易见/正确的方法

WITH T AS (
    SELECT
     ByDay.[Day]
    ,ByDay.[Campaign Name]
    ,ByDay.[Revenue USD]
    FROM ByDay
    WHERE ByDay.[Period]='Mar 2012'
),
TT AS (
    SELECT
     ByDay.[Campaign Name]
    ,SUM(ByDay.[Revenue USD]) [Sum Revenue USD]
    FROM ByDay
    WHERE ByDay.[Period]='Mar 2012'
    GROUP BY ByDay.[Campaign Name]
)
SELECT * FROM (
SELECT
     T.[Day]
    ,T.[Campaign Name]
    ,T.[Revenue USD]
    ,TT.[Sum Revenue USD]
    ,DENSE_RANK() OVER(ORDER BY TT.[Sum Revenue USD] DESC) AS R
    FROM T
    INNER JOIN TT ON T.[Campaign Name]=TT.[Campaign Name]
) TTT
WHERE R < 11
ORDER BY R
有没有一种更简单的方法可以得到这样的结果?

您可以使用[Campaign Name]的SUM[Revenue USD]超额分配来获得每个Campaign Name的总和。那么您只需要一个CTE:

您可以通过[Campaign Name]使用SUM[Revenue USD]超额分配来获取每个活动名称的金额。那么您只需要一个CTE:


谢谢你的好提示-现在我的查询读起来相当符合逻辑。谢谢你的好提示-现在我的查询读起来相当符合逻辑
WITH T AS (
    SELECT
     ByDay.[Day]
    ,ByDay.[Campaign Name]
    ,ByDay.[Revenue USD]
    ,SUM(ByDay.[Revenue USD]) OVER(Partition By ByDay.[Campaign Name]) [Sum Revenue USD] 
    FROM ByDay
    WHERE ByDay.[Period]='Mar 2012'
)
SELECT * FROM (
SELECT
     T.[Day]
    ,T.[Campaign Name]
    ,T.[Revenue USD]
    ,T.[Sum Revenue USD]
    ,DENSE_RANK() OVER(ORDER BY T.[Sum Revenue USD] DESC) AS R
    FROM T
) TTT
WHERE R < 11
ORDER BY R