34,590
社区成员
发帖
与我相关
我的任务
分享
create table test
(rn int,分数 decimal(5,1),姓名 varchar(10))
insert into test
select 1,8.0,'王五' union all
select 2,7.0,'王五' union all
select 3,4.0,'王五' union all
select 1,10.0,'张三' union all
select 2,9.0,'张三' union all
select 3,9.0,'张三' union all
select 4,8.0,'张三' union all
select 1,9.0,'李四'
select row_number() over(order by sum(分数) desc) '排名',
姓名,
sum(分数) '总分'
from
(select 姓名,
分数,
row_number() over(partition by 姓名 order by 分数 desc) 'rn'
from [test]) t
where rn<=3
group by 姓名
having count(1)=3
/*
排名 姓名 总分
-------------------- ---------- --------------
1 张三 28.0
2 王五 19.0
(2 row(s) affected)
*/
WITH test(rn,分数,姓名) AS (
SELECT 1, 8.0,'王五' UNION ALL
SELECT 2, 7.0,'王五' UNION ALL
SELECT 3, 4.0,'王五' UNION ALL
SELECT 1,10.0,'张三' UNION ALL
SELECT 2, 9.0,'张三' UNION ALL
SELECT 3, 9.0,'张三' UNION ALL
SELECT 4, 8.0,'张三' UNION ALL
SELECT 1, 9.0,'李四'
),
s(姓名,c) AS (
SELECT 姓名,COUNT(*)
FROM test
GROUP BY 姓名
HAVING COUNT(*) >= 3
),
o(分数,姓名,n) AS (
SELECT 分数,姓名,
ROW_NUMBER() OVER (PARTITION BY 姓名 ORDER BY 分数 DESC)
FROM test
)
SELECT s.姓名,
SUM(o.分数) 总分数,
RANK() OVER (ORDER BY SUM(o.分数) DESC) 排名
FROM s
JOIN o
ON s.姓名 = o.姓名
WHERE o.n<=3
GROUP BY s.姓名
ORDER BY 排名
姓名 总分数 排名
---- --------------------------------------- --------------------
张三 28.0 1
王五 19.0 2