why*_*heq 3 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
Run Code Online (Sandbox Code Playgroud)
有一种更简单的方法.试试这个:
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
Run Code Online (Sandbox Code Playgroud)