首页 > 试题广场 >

考试分数(二)

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

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

id job score
1 C++ 11001
2 C++
10000
3 C++
9000
4 Java 12000
5 Java
13000
6 JS 12000
7 JS
11000
8 JS
9999
9 Java 12500

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

。。。

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

请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序,如下:

id job score
1 C++ 11001
5 Java 13000
6 JS 12000
7 JS 11000

(注意: sqlite 1/2得到的不是0.5,得到的是0,只有1*1.0/2才会得到0.5,sqlite四舍五入的函数为round)

示例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,'JS',12000),
(7,'JS',11000),
(8,'JS',9999),
(9,'Java',12500);

输出

1|C++|11001
5|Java|13000
6|JS|12000
7|JS|11000
select id  
,job    
,score
from(
select *
, avg(score)over(partition by job) as avg_score
from grade
) a
where score >avg_score
order by id
发表于 2025-04-08 12:49:14 回复(0)
select *
from grade g1
where exists(
select 1
from grade g2
where g1.job=g2.job
group by job
having g1.score>avg(score)
)
order by id;

发表于 2025-03-08 19:51:40 回复(0)
select
    t1.id,
    t1.job,
    t1.score
from
    grade t1
    left join (
        select
            job,
            avg(score) score
        from
            grade
        group by
            job
    ) t2 on t1.job = t2.job
where
    t1.score > t2.score
order by
    t1.id

发表于 2025-01-08 21:25:38 回复(0)
with
    t as (
        select
                        g.job,
            avg(g.score) as avg
        from
            grade g
        group by
            g.job
    ) select g1.id,g1.job,g1.score from grade g1 inner join t on g1.score>t.avg and g1.job=t.job order by g1.id asc

发表于 2024-10-10 09:55:09 回复(0)
先求每个工作的平均分
select g.job,avg(g.score) as avg from grade g group by g.job 
然后与原表内关联,得到id,job,score和平均分,筛选score>平均分
select g1.* from grade g1,
(select
g.job,avg(g.score) as avg
    from grade g group by g.job ) g2
where g1.job=g2.job
and g1.score>g2.avg


发表于 2024-08-02 20:59:51 回复(0)
两种方法:
-- 法一 连接查询,为每个job匹配其job_avg,再判断
SELECT
    t1.*
FROM 
    grade t1
LEFT JOIN(
    SELECT
        job,
        AVG(score) as avg_score
    FROM
        grade
    GROUP BY job
    ) t2 
ON t1.job = t2.job
WHERE t1.score > t2.avg_score;
(2)使用窗口函数avg() over()
-- 法2 窗口函数算job均分
SELECT 
    t1.id,
    t1.job,
    t1.score
FROM
    (SELECT
        id,
        job,
        score,
        avg(score) OVER(PARTITION by job) as job_avg
    FROM
        grade) t1
WHERE
    t1.score>t1.job_avg;  
-- 因为不能直接判断原生字段score与计算字段job_avg的大小,因此将其作为子查询,通过外部查询来判断这一条件


发表于 2024-07-07 19:26:05 回复(0)
select
    g1.*
from grade g1 join
(
    select 
        job,
        avg(score) avg_score
    from grade
    group by job
) g2
on g1.job=g2.job and g1.score>g2.avg_score
order by g1.id
发表于 2024-06-05 21:09:24 回复(0)
SELECT a.id, a.job, a.score
FROM grade a
LEFT JOIN (SELECT job, avg(score) as avg_s FROM grade GROUP BY job) b
on a.job=b.job
WHERE a.score > b.avg_s
order by a.id

-- 窗口函数
SELECT id, job, score
FROM (
    SELECT *,avg(score) over (partition by g.job) av from grade g
) t1
where score > av
order by 1

编辑于 2024-02-28 23:17:54 回复(0)
select * from grade a
where score>(select avg(score) from grade where job=a.job)
order by a.id;

发表于 2024-02-07 14:18:08 回复(0)
# 请你写一个sql语句查询用户分数大于其所在工作(job)分数的平均分的所有grade的属性,并且以id的升序排序,如下:

with dwd_data as (
 select 
 id	,job,score,
 avg(score)over(partition by job) as avg_score
 from grade
)

select 
 id	,job,score
from dwd_data
where score > avg_score
order by 1;

发表于 2023-09-25 11:16:12 回复(0)
select
    grade.*
from
    grade,
    (
        select
            job,
            avg(score) avg
        from
            grade
        group by
            job
    ) s1
where
    grade.job = s1.job
    and grade.score > s1.avg
发表于 2023-09-02 19:50:24 回复(0)
为什么排行里面靠前的大家都用的sqlite?
with
t1 as(
    select
        job
        ,avg(score) as avg
    from 
        grade
    group by
        job
)

select
    t.id
    ,t.job
    ,t.score
from 
    grade t
left join 
    t1
on
    t.job = t1.job
where
    t.score >  t1.avg


发表于 2023-05-25 15:05:10 回复(0)
select id,job,score
from (
    select id,job,score,
    avg(score) over(partition by job) as avg_score
    from grade
)t 
where t.score > t.avg_score
order by id;



发表于 2022-12-31 11:52:25 回复(0)
使用自连接
select id,job,score
from grade g1
where score >(
    select avg(score) from grade g2
    where g1.job = g2.job
    group by job
)order by id;
发表于 2022-10-14 17:18:55 回复(0)
select *
from grade g
where score > (select avg(score) from grade where job = g.job)
order by id asc
发表于 2022-09-16 02:37:20 回复(0)
select id,job,score from
(select id,job,score,avg(score)over(partition by job) avg_score from grade) t
where score>avg_score
order by 1

发表于 2022-09-08 16:18:49 回复(0)
select a.id,a.job,a.score  from grade a join 
(select job ,avg(score) AVG from grade group by job) b on 
a.job=b.job
where a.score>b.AVG
发表于 2022-08-04 10:33:12 回复(0)
select a.*
from grade as a
left join
(select job, avg(score) as avg from grade group by job) as b
on a.job = b.job 
where a.score > b.avg
order by id
;

发表于 2022-07-12 17:24:29 回复(0)
#建立临时表得到每个job的score的均值
with avg_grade as 
(select 
    job,avg(score) avg_score
from grade
group by job
)
#笛卡尔积join一下,可以画个图看看
select t1.id,t2.job,t1.score
from grade t1
join avg_grade t2
on t1.job = t2.job
where t1.score > t2.avg_score
order by id asc;


发表于 2022-06-27 22:32:30 回复(0)