nowcoder-[编程题]获得积分最多的人(三)

来源

牛客网
链接:
https://www.nowcoder.com/questionTerminal/d2b7e2a305a7499fb310dc82a43820e8?orderByHotValue=1&questionTypes=000101&page=1

题目描述

[编程题]获得积分最多的人(三)

  • 热度指数:38321 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M

  • 算法知识视频讲解

    牛客每天有很多用户刷题,发帖,点赞,点踩等等,这些都会记录相应的积分。

    有一个用户表(user),简况如下:

在这里插入图片描述

还有一个积分表(grade_info),简况如下:

在这里插入图片描述

第1行表示,user_id为1的用户积分增加了3分。  
第2行表示,user_id为2的用户积分增加了3分。  
第3行表示,user_id为1的用户积分减少了1分。
   .......  
最后1行表示,user_id为3的用户积分减少了1分。

请你写一个SQL查找积分最高的用户的id,名字,以及他的总积分是多少(可能有多个),查询结果按照id升序排序,以上例子查询结果如下:

在这里插入图片描述

解释:

user_id为1和3的先加了3分,但是后面又减了1分,他们2个是2分,

其他3个都是3分,所以输出其他三个的数据

示例1

输入

drop table if exists user;
drop table if exists grade_info;

CREATE TABLE user (
id  int(4) NOT NULL,
name varchar(32) NOT NULL
);

CREATE TABLE grade_info (
user_id  int(4) NOT NULL,
grade_num int(4) NOT NULL,
type varchar(32) NOT NULL
);

INSERT INTO user VALUES
(1,'tm'),
(2,'wwy'),
(3,'zk'),
(4,'qq'),
(5,'lm');

INSERT INTO grade_info VALUES
(1,3,'add'),
(2,3,'add'),
(1,1,'reduce'),
(3,3,'add'),
(4,3,'add'),
(5,3,'add'),
(3,1,'reduce');

输出

2|wwy|3
4|qq|3
5|lm|3

答案

WITH t AS (
    SELECT  user_id,SUM(grade_num) AS grade_sum
    FROM (SELECT user_id,grade_num * IF(type= 'add',1,-1) AS grade_num
          FROM grade_info )AS t1
    GROUP BY user_id )
SELECT id,name,grade_sum
FROM t
JOIN user u ON u.id = t.user_id
WHERE grade_sum  = (SELECT MAX(grade_sum) FROM t)

1、创建t1表,取出user_id,和通过if添加正负号的分数grade_num。

2、分组求和得到user_id及对应的总分数grade_sum,并通过WITH……AS……打包成临时表t,方便后续多次引用
3、WHERE筛选出grade_sum=最大值的行,连接并取出题目所需列

地址

https://www.nowcoder.com/questionTerminal/d2b7e2a305a7499fb310dc82a43820e8?orderByHotValue=1&questionTypes=000101&page=1

Gitee和GitHub地址,欢迎关注,不定期更新内容,点亮技能树。

Gitee nowcoder题目地址

Gitee 【获得积分最多的人】全部代码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值