首页 > 试题广场 >

考试分数(二)

[编程题]考试分数(二)
  • 热度指数:98857 时间限制: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(g.`score`)over(PARTITION BY g.job ) average FROM grade g 
)t1 WHERE t1.score> t1.average

😂 直接窗口函数 越来越熟练了

发表于 2021-08-15 22:32:56 回复(0)
SELECT a.*
FROM grade a
LEFT JOIN
    (
    SELECT job, avg(score) as avg
    FROM grade
    GROUP BY job
    ) b
ON a.job = b.job  
WHERE a.score > b.avg
ORDER BY a.id
发表于 2020-10-27 23:01:28 回复(1)
-- 窗口函数. 对job集每个行记录中进行均值计算
select id, job, score
from
  (select id,job,score,
    avg(score)over(partition by job)av
   from `grade`
  )t1
where score > av
order by 1 ;

-- 头铁的人就是直接子查询怼上去
select 
  id,
  job, 
  score 
from `grade` t1
where score >
  (select avg(score) from `grade` t2 where t1.job = t2.job)
order by
  1 ;

-- 更头铁的人直接连表
select id, t1.job, score
from `grade` t1
  left join
  (select job,avg(score)av from `grade` group by 1)t2
  on t1.job = t2.job
where t1.score > t2.av
order by 1 ;


发表于 2021-04-16 11:16:34 回复(9)
通过考试分数(一) https://blog.nowcoder.net/n/c3455ba1ab0e4f118f0c890e9936d7e7 知道,每个岗位的平均分sql代码如下:
(select job,round(sum(score)*1.0/count(id),3) as avg from grade
group by job) 
可以把它查询出来的数据看成一个新表,用现在的表去联立这个新表,获得当job相同时,现在的表大于新表的分数,那么就可以得到各个岗位大于平均数的信息了,最后按照id升序
 
select grade.* from grade join 
(select job,round(sum(score)*1.0/count(id),3) as avg from grade
group by job) as t
on grade.job=t.job --联立新表,job相同
where grade.score > t.avg --现在的表的分数大于新表的分数
order by id

发表于 2020-09-21 10:18:53 回复(6)
1.用两个select实现
select * from grade
where score > 
      (select avg(score) from grade g1 where g1.job = grade.job)
order by id
2.把job及对应的平均数建立一个表,然后与原表连接
select g.id, g.job, score 
from grade g join (select job, avg(score) avg1 from grade group by job)s
on g.job = s.job
where score > avg1
order by id




编辑于 2021-02-21 21:59:23 回复(8)
select * from grade
group by job having score>avg(score)
order by id asc;
请教问题出在哪里
发表于 2020-09-24 15:22:41 回复(13)
SELECT *
from grade g
where score > (select avg(score)
               from grade
               where job=g.job)
order by g.id

发表于 2021-09-15 16:21:46 回复(6)
运用窗口函数avg() over (partition by..) 增加一列各类的平均值,再筛选出score>avg_score的记录即可
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
发表于 2020-10-11 18:56:12 回复(6)
通过left join 加入每一个考试对应的平均成绩,再使得个人考试的成绩大于平均成绩进行筛选即可。
select
    g.id,
    g.job,
    g.score
from grade as g
left join 
(
    select
        job,
        avg(score) as avg_score
    from grade
    group by job 
) as b
on g.job = b.job 
where g.score > b.avg_score
order by g.id asc
编辑于 2020-09-20 21:21:38 回复(1)
如果在外层增加group by ,则不能过滤出同一个职位下大于平均工资的多个数据

select* from grade  g1 where score>
(select avg(score) from grade g2 where g1.job=g2.job group by job )
order by id asc
发表于 2021-07-08 18:06:38 回复(1)
直接用个子查询就好
select g.id,g.job,g.score from grade g
where g.score > (select avg(g2.score) from grade g2 where g2.job = g.job group by g2.job)
order by g.id

编辑于 2020-12-17 09:00:27 回复(2)
两种方法:
-- 法一 连接查询,为每个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 t1.id,t1.job,t1.score 
from grade t1
where score >
(select avg(score) from grade t2 
 where t1.job = t2.job group by job
)
order by t1.id

发表于 2022-05-15 23:26:51 回复(0)
with 
t2 as (select id, job, score, avg(score)over(partition by job) as avg from grade) #新加一列对应工作的平均值
select id, job, score from t2 where score > avg
# with as yyds
发表于 2022-02-25 10:18:33 回复(0)
建立一个新表,包含job及对应平均数,将原grade表与新表连接,设定条件原表score大于新表的平均数筛选出符合条件的属性。

select g1.id, g1.job, g1.score 
from grade g1,
(select job, avg(score) as avg from grade group by job) g2
where g1.job = g2.job
and g1.score >g2.avg
order by id


发表于 2021-10-04 22:35:10 回复(0)
select a.id,a.job,a.score from 
(select *,avg(score)over(partition by job) as avg2 from grade) a 
where a.score>a.avg2
利用窗口函数,求解出每个工作岗位的均值,作为新字段形成一张新的表。从新表中直接取出,scroe大于均值的即可
发表于 2021-09-24 11:01:23 回复(0)
1、与原表连接
select g1.id,g1.job,g1.score from grade g1
join (select job,avg(score)as avg from grade
     group by job)g2
on g1.job=g2.job
and g1.score>g2.avg
order by g1.id

2、子查询
select id,job,score from grade g1
where score >(select avg(score) from grade g2
             where g1.job=g2.job)
order by id


发表于 2021-08-17 22:23:53 回复(0)
SELECT id, job, score
FROM grade a
WHERE score> (SELECT ROUND(AVG(score),3)
FROM grade b
where a.job = b.job)
ORDER BY a.id
朋友们,子查询里面的 a.job = b.job怎么理解?

发表于 2021-01-02 18:00:07 回复(5)
SELECT g.id, g.job, g.score
FROM grade g INNER JOIN 
(SELECT job, avg(score) average
FROM grade
group by job) t ON g.job = t.job AND g.score>t.average;
把每个job的平均分求出来后和原表联结。
发表于 2020-11-24 15:55:04 回复(0)
select a.id, a.job, a.score
from grade a
inner join
(select job, round(avg(score)*1.0,3) as avg_scr 
 from grade 
 group by job) temp
 on a.job = temp.job
 and a.score > temp.avg_scr;

发表于 2020-10-19 01:04:34 回复(0)