Tsql 组合分组和排名的正确方式是什么?
在下面的查询中,我已经有了一个逐日细分的视图 现在,我想对其进行过滤,这样,如果其活动在前10个创收活动中,结果中将包含一行 我得到了我想要的,但我有一种感觉,在这个过程中,我可能跳过了显而易见/正确的方法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' ),
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