2013-02-21 2 views
3

У меня есть следующее, которое работает, но я думаю, что я сделал свой обычный трюк из-за усложнения чего-то, что может быть намного проще.Функция раздела RANK, используемая в сочетании с SUM OVER

Если вы запустите скрипт, вы увидите, чего я пытаюсь достичь - просто ранжирование сначала по счету Департамента, а затем оценка по каждому имени в каждом отделе.

Как упростить следующие ?:

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 

ответ

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 
+0

+1 не может представить, чтобы у кого-то были более простые предложения! – whytheq

Смежные вопросы