RANK分区函数与SUM OVER一起使用

时间:2013-02-21 16:15:09

标签: sql sql-server-2008-r2

我有以下哪些有效,但我认为我已经做了一些过于复杂的事情,这可能会更简单。

如果您运行脚本,您将看到我想要实现的目标 - 只需按部门得分排名,然后按每个部门的每个名称得分排名。

如何简化以下操作?:

IF OBJECT_ID('TEMPDB..#Table') IS NOT NULL BEGIN DROP TABLE #Table END;
 CREATE TABLE #Table 
    (
    Department VARCHAR(100),
    Name VARCHAR(100),
    Score INT
    );

INSERT INTO #Table VALUES
('Sales','michaeljackson',7),
('Sales','jim',10),
('Sales','jill',66),
('Sales','j',1),    
('DataAnalysis','jagoda',66),
('DataAnalysis','phil',5),
('DataAnalysis','jesus',6),
('DataAnalysis','sam',79),
('DataAnalysis','michaeljackson',9999);

WITH SumCte AS
    (
    SELECT  Department,
        sm = sum(Score) 
    FROM    #Table
    GROUP BY Department
    )
, RnkDepCte AS
    (
    SELECT  Department,
        rk =RANK() OVER (ORDER BY sm DESC)
    FROM    SumCte
    )
, RnkCte AS
    (
    SELECT  Department,
        Name,
        Score,
        rnk = RANK() OVER (PARTITION BY a.Department ORDER BY a.Score DESC)
    FROM    #Table a 
    )   
SELECT a.Department,
       a.Name,
       a.Score,
       FinalRank = RANK() OVER (ORDER BY ((10000/b.rk) + (100/a.rnk)) DESC)
FROM   RnkCte a 
       INNER JOIN RnkDepCte b 
        ON a.Department = b.Department

1 个答案:

答案 0 :(得分:7)

有一种更简单的方法。试试这个:

select t.*,
       RANK() over (order by sumscore desc, score desc)
from (select t.*,
             SUM(score) over (partition by department) as SumScore
       from #Table t
      ) t