首页 > 解决方案 > 是否可以通过 T-SQL 中另一个窗口函数的结果对数据集进行排名?

问题描述

有没有办法通过另一个窗口函数的结果对数据集进行排名?

例如,我有一个如下查询:

select distinct 
    country,
    cast(sum(Sessions) over (partition by country) as float) / cast(sum(sessions) over() as float) as sess_prcnt
from 
    GoogleAnalytics.dbo.SiteVisitsLog
order by 
    sess_prcnt desc

我想做的是按sess_prcnt列对国家进行排名。添加类似rank() over(order by sess_prcnt) 或使用 CTE 的行会产生错误。

先感谢您!

标签: sqlsql-servertsqlwindow-functionsrank

解决方案


你说使用 CTE 会产生错误——它们会导致什么样的错误?例如,做类似的事情的任何问题

; WITH A AS
    (select distinct 
        country,
        cast(sum(Sessions) over (partition by country) as float) / cast(sum(sessions) over() as float) as sess_prcnt
    from 
        GoogleAnalytics.dbo.SiteVisitsLog
    )
SELECT *, rank() OVER (order by sess_prct DESC) AS rnk
FROM A
order by 
    sess_prcnt desc

或类似使用它作为 FROM 子句的一部分

SELECT *, rank() OVER (order by sess_prct DESC) AS rnk
FROM 
    (select distinct 
        country,
        cast(sum(Sessions) over (partition by country) as float) / cast(sum(sessions) over() as float) as sess_prcnt
    from 
        GoogleAnalytics.dbo.SiteVisitsLog
    ) A
order by 
    sess_prcnt desc

您可能还想确保为您的任务使用适当的排名函数 - ROW_NUMBER、RANK 或 DENSE_RANK


推荐阅读