首页 > 试题广场 >

考试分数(四)

[编程题]考试分数(四)
  • 热度指数:68309 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

牛客每次考试完,都会有一个成绩表(grade),如下:

id job score
1 C++
11001
2 C++
11000
3 C++
9000
4 JAVA
12000
5 JAVA
13000
6 B
12000
7
B
11000
8 B
9999

第1行表示用户id为1的用户选择了C++岗位并且考了11001分

。。。

第8行表示用户id为8的用户选择了B语言岗位并且考了9999分

请你写一个sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序,结果如下:

job start end
B 2 2
C++ 2 2
Java 1 2

解释:

第1行表示C++岗位的中位数位置范围为[2,2],也就是2。因为C++岗位总共3个人,是奇数,所以中位数位置为2是正确的(即位置为2的10000是中位数)

第2行表示Java岗位的中位数位置范围为[1,2]。因为Java岗位总共2个人,是偶数,所以要知道中位数,需要知道2个位置的数字,而因为只有2个人,所以中位数位置为[1,2]是正确的(即需要知道位置为1的12000与位置为2的13000才能计算出中位数为12500)

第3行表示前端岗位的中位数位置范围为[2,2],也就是2。因为B语言岗位总共3个人,是奇数,所以中位数位置为2是正确的(即位置为2的11000是中位数)

(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round,sqlite不支持floor函数,支持cast(x as integer) 函数,不支持if函数,支持case when ...then ...else ..end函数)

示例1

输入

drop table if exists grade;
CREATE TABLE  grade(
`id` int(4) NOT NULL,
`job` varchar(32) NOT NULL,
`score` int(10) NOT NULL,
PRIMARY KEY (`id`));

INSERT INTO grade VALUES
(1,'C++',11001),
(2,'C++',10000),
(3,'C++',9000),
(4,'Java',12000),
(5,'Java',13000),
(6,'B',12000),
(7,'B',11000),
(8,'B',9999);

输出

B|2|2
C++|2|2
Java|1|2
select job,
    floor((max(rank_number)+min(rank_number))/2) start,
    ceil((max(rank_number)+min(rank_number))/2) end
from (
    select id,job,score,
    dense_rank()over(partition by job order by score ) as rank_number
    from grade ) t
group by job
order by job 

发表于 2024-10-22 14:23:51 回复(0)
SELECT
    job,
    FLOOR((COUNT(DISTINCT id) - 1)/2 + 1) start,
    CEIL((COUNT(DISTINCT id) - 1)/2 + 1) end
FROM grade
GROUP BY job

发表于 2024-09-11 18:45:30 回复(0)

本题的重点在于中位数的取数方法,由于偶数有两个、奇数有一个中位数,所以可以通过(n+1)/2, 然后根据结果值向上与向下取整,即可得到对应的位置信息

select job
-- 向下取整
, floor((count(id)+1)/2) as floor_data
-- 向上取整
, ceil((count(id)+1)/2) as ceil_data
from grade 
group by job
order by job asc
发表于 2024-08-13 16:36:27 回复(0)

一时间忘了取整函数是什么了。。。

select
    job,
    if(t.total%2,floor(t.total/2)+1,floor(t.total/2)) start,
    if(t.total%2,floor(t.total/2)+1,floor(t.total/2)+1) end
from (
    select
        job,
        count(id) total
    from grade
    group by job
) t
order by job
发表于 2024-06-10 23:26:37 回复(0)
select job,
round(if(count(score)%2=0,count(score)/2,ceiling(count(score)/2))) as start,
round(if(count(score)%2=0,count(score)/2+1,ceiling(count(score)/2))) as end
from grade
group by job
order by job
发表于 2024-04-08 10:46:39 回复(0)
select aa.job, 
round(num/2,0) start,
round((num+1)/2,0)  end
from 
(select job, count(score) num
from grade
group by job ) aa
order by aa.job 

发表于 2023-12-29 17:09:00 回复(0)
select job,round(ceil(count(score)/2)) start,if(count(score)%2=1,round(ceil(count(score)/2)), round((count(score)/2)+1))end from grade
group by job
order by job
发表于 2023-11-22 16:44:04 回复(0)
select  a.job, if(a.count%2=1 ,ceil(a.count/2),ceil(a.count/2)) as start,
if(a.count%2=1 ,ceil(a.count/2),ceil(a.count/2+1) ) as end
 from(
    select job,count(job) as count
    from grade 
    group by job 
 ) a
 order by a.job

发表于 2023-11-02 11:37:09 回复(0)
#方法1
select job,round(if(n%2=0, n/2,(n+1)/2),0) as start,
           round(if(n%2=0, n/2+1,(n+1)/2),0) as end
from(
select job,count(*) as n 
from grade group by job) a
order by job

#方法2
select job,floor((count(*)+1)/2) as start,ceil((count(*)+1)/2) as end
from grade
group by job
order by job


#方法3 因为mysql没有python的银行家舍入法则,而是严格按照四舍五入来的,所以以下方法适用
select job,round(count(*)/2) as start,round((count(*)+1)/2) as end
from grade 
group by job
order by job

发表于 2023-10-16 12:59:47 回复(0)
除了可以用floor和ceiling函数外,mod(被除数,除数)--取余;(11 div 2)返回值5--取商
select job,floor((count(score)+1)/2) start,ceiling((count(score)+1)/2) end
from grade
group by job
order by job

select job,if(mod(cs,2)=1,(cs div 2)+1,(cs div 2)) as start,
if(mod(cs,2)=0,(cs div 2)+1,(cs div 2)+1) as end
from
(select job,count(score) as cs
from grade
group by job ) as t1
order by job


发表于 2023-09-27 17:59:54 回复(0)
select a.job, a.rn1 as start, a.rn2 as end
from
(select *,
count(id) over(partition by job) as c,
row_number() over(partition by job order by score) as rn1,
row_number() over(partition by job order by score desc) as rn2
from grade
)a
where rn1>=c/2 and rn2>=c/2 and rn1<=rn2
order by a.job
发表于 2023-09-22 11:39:56 回复(0)
select job,
round(max(rk)/2) start,
round(max(rk+1)/2) end from
(select id,job,rank() over (partition by job order by score desc) rk from grade)a
group by job
发表于 2023-08-12 02:01:06 回复(0)
知识点:case when分情况讨论
with
t as
(
        select
            job
            ,count(job) as total
        from 
            grade
        group by 
            job
)
,t2 as
(
select 
    job
    ,case when total % 2 = 0
          then total / 2 
          else ( total +1 ) /2
    end as start
    , case when total % 2 !=0
           then (total + 1 ) / 2
           else total /2 +1
    end as end
from 
    t
)
select 
    job
    ,round(start,0)
    ,round(end,0)
from 
    t2
order by 
    job

发表于 2023-05-29 11:06:49 回复(0)
# 请你写一个sql语句查询各个岗位分数升序排列之后的中位数位置的范围,并且按job升序排序

with t1 as(
    select job,count(*) as  cnt
    from grade
    group by job
)

select job,ceil(cnt/2) as start,ceil((cnt+1)/2) as end
from  t1
order by job asc

发表于 2023-03-24 09:29:26 回复(0)
select distinct job,round(num/2) as start,round((num+1)/2) as end
from (
    select job,
    count(job) over(partition by job) as num
    from grade
)t
order by job;


发表于 2023-01-06 15:05:51 回复(0)
with t1 as
(select * 
from order_info
where date>='2025-10-15' and status='completed')
,
t2 as 
(select t1.*,case when 
            product_name='C++' 
         or product_name='Java'
         or product_name='Python' then 1
         else 0 end as JG
from t1)

select t2.user_id,min(t2.date),sum(t2.JG)
from t2
group by t2.user_id,t2.JG
having sum(t2.JG)>=2
order by t2.user_id;
发表于 2022-11-17 22:29:49 回复(0)
分数升序排序之后的中位数位置  这句话怎么体现 
发表于 2022-10-27 15:25:51 回复(0)