22,209
社区成员
发帖
与我相关
我的任务
分享
--并列的
SELECT *
,( SELECT COUNT(DISTINCT 学生ID)
FROM tb B
WHERE (case when B.语文=-1 or B.数学=-1 then 0 else B.语文+B.数学 END)<(case when A.语文=-1 or A.数学=-1 then 0 else A.语文+A.数学 END)
)+1 AS 排名
FROM tb A
--不并列的
SELECT *
,( SELECT COUNT(*)
FROM tb B
WHERE (case when B.语文=-1 or B.数学=-1 then 0 else B.语文+B.数学 END)<(case when A.语文=-1 or A.数学=-1 then 0 else A.语文+A.数学 END)
)+1 AS 排名
FROM tb A
发两遍?
--2005
select *,名次=row_number() /*总分相同的名次并列的 将row_number 换成dense_rank*/over(order by 总分 desc)
from
(
select 学生id,语文, 数学, 总分=case when 语文=-1 then 0 else 语文 end
+case when 数学=-1 then 0 else 数学 end
from tb
) t
select *,排名=dense_rank() over(order by 总分 desc)
from(
select 学生ID,语文,数学case when 语文=-1 or 数学=-1 then 0 else 语文+数学 end as 总分
from tb
) t
select *,排名=rank() over(order by 总分 desc)
from(
select 学生ID,case when 语文=-1 or 数学=-1 then 0 else 语文+数学 end as 总分
from tb
) t
order by 3
select
学生id,sum(case when 语文<>-1 and 数学<>-1 then 语文+数学 else 0 end) as 总分
from
tb
group by
学生id