列表

详情


SQL288. 今天的刷题量(一)

描述

TM小哥在牛客工作遇到一个需求,让他统计每天各个题单的刷题量。
现在有代码提交(submission)表简况如下:
id subject_id create_time
1 2 2999-02-11
2 2 2999-02-21
3 1 2999-02-21
4 1 2999-02-22
5 3 2999-02-22
6 2 2999-02-22
7 2 2999-02-22

第一行表示:某个用户在2999-02-11号在题单2提交了一次代码
。。。。
最后一行表示:某个用户在2999-02-22号在题单2提交了一次代码

现在有题单(subject)表简况如下:
id name
1 jzoffer
2 tiba
3 huaweijishu
4 top101
第一行表示:题单id为1的是剑指offer
。。。
最后一行表示:题单id为4的是面试笔刷TOP101

请你写出一个SQL,查找出当天(对,就是你现在写代码的这一天,实现原理就是后台有特殊程序会将'2999-02-22'这个东西变为今天的日期,并且将'2999-02-21'变为昨天的日期)的每个题单的刷题量,先按提交数量降序排序,如果提交数量一样的话,再按subject_id升序排序,以上例子查询如下:
name cnt
tiba 2
jzoffer
1
huaweijishu
1
解释:
第一行表示题霸这个专题一天的提交量为2,排名最靠前
第二行,第三行表示剑指offer,华为机试这2个专题一天的提交量都为1,但是剑指offer的subject_id比较小,排在前面


注:由于后台有程序会将'2999-02-22'这个东西变为今天的日期,并且将'2999-02-21'变为昨天的日期,请写出通用的代码,不然可能你的代码只有今天可以通过哟~




示例1

输入:

drop table if exists submission;
CREATE TABLE submission (
id int(11) NOT NULL,
subject_id int(11) NOT NULL,
create_time date NOT NULL
);

CREATE TABLE subject (
id int(11) NOT NULL,
name varchar(32) NOT NULL
);

INSERT INTO submission VALUES
(1,2,'2999-02-11'),
(2,2,'2999-02-21'),
(3,1,'2999-02-21'),
(4,1,'2999-02-22'),
(5,3,'2999-02-22'),
(6,2,'2999-02-22'),
(7,2,'2999-02-22');

INSERT INTO subject VALUES
(1,'jzoffer'),
(2,'tiba'),
(3,'huaweijishi'),
(4,'top101');

输出:

name|cnt
tiba|2
jzoffer|1
huaweijishi|1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Sqlite 解法, 执行用时: 11ms, 内存消耗: 3524KB, 提交时间: 2022-04-17

select name,count(name) cnt from submission sn join subject st on subject_id=st.id where create_time=current_date
group by name order by cnt desc,subject_id

Sqlite 解法, 执行用时: 12ms, 内存消耗: 3492KB, 提交时间: 2022-04-17

select name,count(st.name) cnt
from subject st join submission sn
on st.id=sn.subject_id
where create_time =current_date
group by st.name
order by cnt desc ,sn.subject_id

Sqlite 解法, 执行用时: 12ms, 内存消耗: 3496KB, 提交时间: 2022-04-02

select s2.name,count(*) cnt
from submission s1
join subject s2
on s1.subject_id=s2.id
where create_time=current_date
group by s2.name
order by cnt desc,s1.subject_id asc;

Sqlite 解法, 执行用时: 12ms, 内存消耗: 3516KB, 提交时间: 2022-05-01

select s2.name,count(*) cnt
from 
(select subject_id from submission 
where create_time = CURRENT_DATE
) s1 left join subject s2 
on s1.subject_id = s2.id
group by s2.name   
order by count(*) desc,s1.subject_id;

Sqlite 解法, 执行用时: 12ms, 内存消耗: 3520KB, 提交时间: 2022-05-08

select tb2.name, count(*) as cnt
from submission as tb1 left join subject as tb2 on
tb1.subject_id=tb2.id
where tb1.create_time=current_date
group by tb2.name, tb1.subject_id
order by cnt desc, tb1.subject_id

上一题