当前位置: 首页 > news >正文

SQL示例:巧妙的解题思路学习(MySQL)

SQL68 短视频直播间晚上11-12点之间各直播间的在线人数


描述

现有某天短视频直播间用户观看直播间的信息表user_view_tb如下,

(其中字段包含用户id:user_id、直播间id:room_id、 进入时间:in_time,离开时间:out_time)

user_idroom_idin_timeout_time
1100110:00:0010:30:00
2100110:01:0010:05:00
3100110:05:0010:20:00
1100219:05:0020:05:00
2100219:15:0019:55:00
2100220:15:0020:45:00
3100220:15:0020:45:00
4100322:15:0023:15:00
1100223:15:0023:45:00
4100223:10:0023:25:00
3100223:00:0023:35:00
4100123:10:0023:25:00
3100123:00:0023:35:00
4100323:10:0023:15:00
1100120:10:0020:15:00
1100120:00:0023:35:00

有直播间信息表room_info_tb如下:

room_idroom_nameroom_type
1001娱乐大王牌娱乐
1002声家班搞笑
1003嗨嗨嗨搞笑

请你统计晚上11-12点之间各直播间的在线人数(包含边界值11:00、12:00),并按在线人数降序排序,以上例子输出结果如下:

room_idroom_nameuser_count
1001娱乐大王牌3
1002声家班3
1003嗨嗨嗨1

解法

SELECT u.room_id, r.room_name, COUNT(DISTINCT u.user_id) AS user_count FROM user_view_tb u JOIN room_info_tb r ON u.room_id = r.room_id WHERE u.in_time < '24:00:00' -- 进入时间在12点前 AND u.out_time > '23:00:00' -- 离开时间在11点后 GROUP BY u.room_id, r.room_name ORDER BY user_count DESC, u.room_id;

SQL60 统计加班员工占比


描述

某公司员工信息数据及单日出勤信息数据如下:

员工信息表staff_tb(staff_id-员工id,staff_name-员工姓名,staff_gender-员工性别,post-员工岗位类别,department-员工所在部门),如下所示:

staff_idstaff_namestaff_genderpostdepartment
1AngusmaleFinancialdep1
2CathyfemaleDirectordep1
3AldisfemaleDirectordep2
4LawsonmaleEngineerdep1
5CarlmaleEngineerdep2
6BenmaleEngineerdep1
7RosefemaleFinancialdep2

出勤信息表attendent_tb(info_id-信息id,staff_id-员工id,first_clockin-上班打卡时间,last_clockin-下班打卡时间),如下所示:

info_idstaff_idfirst_clockinlast_clockin
10112022-03-22 08:00:002022-03-22 17:00:00
10222022-03-22 08:30:002022-03-22 18:00:00
10332022-03-22 08:45:002022-03-22 17:00:00
10442022-03-22 09:00:002022-03-22 18:30:00
10552022-03-22 09:00:002022-03-22 18:10:00
10662022-03-22 09:15:002022-03-22 19:30:00
10772022-03-22 09:30:00

2022-03-22 18:29:00

问题:请统计该公司各部门加班员工所占比例?

注:工作时长大于9.5小时定义为加班

要求输出:部门(department)、加班员工占比(ratio,以百分数形式输出并保留1位小数),查询结果按照加班员工占比降序排序;
示例数据结果如下:

departmentratio
dep125.0%
dep20.0%

解释:dep1部门共有4名员工,其中仅有员工6(Ben)在该日加班,所以结果为1/4=25.0%

其他结果同理.....

解法

with t1 as( select department,count(s.staff_id) as tol1 from attendent_tb a join staff_tb s on a.staff_id=s.staff_id group by department ), t2 as ( select department,count(s.staff_id) as tol2 from attendent_tb a join staff_tb s on a.staff_id=s.staff_id where TIMESTAMPDIFF(MINUTE, first_clockin, last_clockin) > 9.5 * 60 group by department ) select t1.department, concat(round(tol2/tol1*100.0,1),'%') as ratio from t1 join t2 on t1.department=t2.department order by ratio desc; --TIMESTAMPDIFF(hour, ...) 只会返回 10(截断小数部分),这样 10 > 9.5 判断会失效。 --改用 TIMESTAMPDIFF(MINUTE, ...),计算分钟差,再转换为小时判断。 --其他的解法 select department, concat( round( sum( case when (unix_timestamp(last_clockin) - unix_timestamp(first_clockin) )/3600 > 9.5 then 1 else 0 end ) * 100 / count(1),1) ,'%') as ratio from staff_tb a1 inner join attendent_tb a2 on a1.staff_id = a2.staff_id group by department order by ratio desc;

SQL67 被重复观看次数最多的3个视频


描述

现有课程信息表 course_info_tb(cid:课程ID,tag:视频类别,release_date:发布日期,duration:视频时长),示例数据如下:

idcidtagrelease_dateduration
19001sql2022-01-0160
29002sql2022-01-0190
39003sql2022-01-0145
49004java2022-01-0245

用户观看记录表 play_record_tb(uid:用户ID,cid:课程ID,start_time:开始观看时间,end_time:结束观看时间,score:用户评分),示例数据如下:

iduidcidstart_timeend_timescore
1100190012022-01-01 08:30:002022-01-01 09:00:004
2100190012022-01-03 09:30:002022-01-03 10:20:002
3100290012022-01-01 08:30:002022-01-01 09:40:003
4100190022022-01-02 08:30:002022-01-02 09:01:002
5100190022022-01-11 08:30:002022-01-11 08:31:013
6100190022022-01-05 08:30:002022-01-05 08:54:012
7100390022022-01-05 08:30:002022-01-05 08:51:014

请找到那些能让用户一遍接一遍重复观看的高回头率视频,输出被重复观看人次数。若某人对某视频只观看了一次,则不计为重复观看次数,如果某人对某视频观看了n次(n>1),则记为该视频重复观看次数+n。如果被重复观看次数一样大,则越晚发布的视频排名越靠前,每个视频的排名为排在他前面的视频个数+1。请找出被重复观看数排名前三的视频,输出这些视频的课程ID、被重复观看次数和排名。结果按排名升序。若被重复观看视频不足三个,按排名全部输出。示例输出如下:

cidpvrk
90023.0001
90012.0002

解法

WITH user_watch AS ( SELECT uid, cid, COUNT(*) AS watch_cnt FROM play_record_tb GROUP BY uid, cid ), repeat_stats AS ( SELECT cid, SUM(watch_cnt) AS pv FROM user_watch WHERE watch_cnt > 1 GROUP BY cid ) SELECT rs.cid, rs.pv, ROW_NUMBER() OVER (ORDER BY rs.pv DESC, ci.release_date DESC) AS rk FROM repeat_stats rs JOIN course_info_tb ci ON rs.cid = ci.cid ORDER BY rk LIMIT 3;
http://www.cnnetsun.cn/news/2452047.html

相关文章:

  • 瑞萨与LVGL PRO合作:嵌入式GUI开发硬件加速与性能优化实践
  • 如何利用PowerShell精准筛选并批量清理注册表残留项
  • 【硬核复刻】用CH552G打造你的专属USB-Blaster
  • 3步打造你的专属数字工作台:告别Obsidian启动迷茫
  • Obsidian科研知识库:构建战略级学术研究基础设施的架构指南
  • 3步解锁求职效率革命:NewJob智能时间识别插件让投递成功率翻倍
  • 【Perplexity本地服务部署全指南】:从零搭建私有化AI查询引擎,3步绕过API限制
  • 如何免费绕过iPhone激活锁:applera1n图形化工具终极指南
  • 网盘直链下载助手:九大平台高速下载的终极解决方案
  • Python GDAL实战:从零构建与处理TIF影像的完整工作流
  • 别再死记硬背了!用BRDF、Irradiance和Radiance的日常比喻,5分钟搞懂图形学光照
  • 3分钟掌握LaTeX公式转Word的终极方案:告别复制粘贴的烦恼
  • 青龙面板签到脚本:一站式全平台自动化签到解决方案,每天节省30分钟
  • 告别浏览器标签混乱:Gmail桌面版(Meru)全面使用指南
  • 别再手动比对了!用Simulink Test Manager搞定MIL单元测试(附状态机测试实例)
  • R语言生存分析实战:从数据模拟到批量Cox回归,一键导出结果表格(附完整代码)
  • 从CRI v1 API未实现错误到Kubelet成功启动:一次完整的Containerd配置排查实录
  • Docker部署Blackbox Exporter监控实战:5分钟搞定HTTP/HTTPS、TCP、Ping探活
  • ASTM D4169-23e1 最全解读|运输包装性能测试国际黄金标准(CSDN 精品版)
  • GBK转UTF-8:彻底告别中文乱码的终极解决方案
  • 2026四款简单好用的收银软件真实测评与推荐
  • AI Coding 开始进入 Skills 时代了:这 8 个仓库我已经离不开
  • Windows运行安卓应用终极指南:APK安装器的完整解决方案
  • FPGA实战:从算法到电路,深度解析Verilog中的BCD与二进制互转设计
  • 手把手教你用Python把文心一言4.0(ERNIE-Bot-4)变成你的本地聊天机器人(附完整代码)
  • CAD 2021 经典界面重塑与高效绘图环境搭建指南
  • Ultimate ASI Loader:Windows游戏模组加载的架构解析与技术实现
  • 别再让图层打架了!Cesium中z-index的实战避坑指南(附Vue3代码)
  • 百度网盘API终极指南:Python自动化离线下载与文件管理完整方案
  • 终极解决方案:Windows版ADB驱动自动化安装工具完整指南