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

SQL138 连续两次作答试卷的最大时间窗

SQL138 连续两次作答试卷的最大时间窗

问题分析

  1. 找出2021年至少有两天作答的用户
  2. 计算每个用户连续两次作答的最大时间窗
  3. 基于历史数据预测在这个时间窗内平均会做多少套试卷

版本1 

with-- 功能​:筛选2021年至少有两天作答的用户及其作答记录-- 子查询找出2021年至少有两天作答的用户ID(count(distinct date(start_time)) >= 2)-- 主查询获取这些用户在2021年的所有作答记录-- 结果包含三列:uid(用户ID)、exam_id(试卷ID)、start_time(作答日期)user_with_multiple_days as (selectuid,exam_id,date(start_time) as start_timefromexam_recordwhereuid in (selectuidfromexam_recordwhereyear(start_time) = 2021group byuidhavingcount(distinct date(start_time)) >= 2)and year(start_time) = 2021),-- 功能​:计算每个用户的日均作答量-- 通过自连接找出每个用户的所有作答日期组合(u1.start_time < u2.start_time)-- 计算每个用户的总作答次数(子查询中的count(start_time))-- 计算最大日期跨度(max(datediff(u2.start_time, u1.start_time) + 1))-- 用总作答次数除以最大日期跨度得到日均作答量(max_avg)max_avg_temp as (selectu1.uid,(selectcount(start_time)fromuser_with_multiple_dayswhereuid = u1.uid) / max(datediff(u2.start_time, u1.start_time) + 1) as max_avgfromuser_with_multiple_days u1join user_with_multiple_days u2 on u1.uid = u2.uidand u1.start_time < u2.start_timegroup byu1.uid),-- 功能​:计算每个用户连续两次作答的最大时间窗-- 使用窗口函数lag()获取每个用户的上一次作答日期-- datediff(start_time, lag(start_time)) + 1计算相邻两次作答的时间窗-- +1是因为间隔2天实际上是3天的窗口(如1号和3号是3-1=2天,但实际窗口是3天)-- max(days_window)找出每个用户的最大时间窗max_windows_temp as (selectuid,max(days_window) as days_windowfrom(selectuid,start_time,datediff(start_time,lag(start_time) over (partition byuidorder bystart_time asc)) + 1 as days_windowfromuser_with_multiple_days) as t1group byuid)
selectuid,days_window,round(days_window * max_avg, 2) as avg_exam_cnt
frommax_avg_tempjoin max_windows_temp using (uid)
order bydays_window desc,avg_exam_cnt desc

1. 第一个CTE:user_with_multiple_days

user_with_multiple_days as (selectuid,exam_id,date(start_time) as start_timefromexam_recordwhereuid in (selectuidfromexam_recordwhereyear(start_time) = 2021group byuidhavingcount(distinct date(start_time)) >= 2)and year(start_time) = 2021
)

功能​:筛选2021年至少有两天作答的用户及其作答记录

详细说明​:

  • 子查询找出2021年至少有两天作答的用户ID(count(distinct date(start_time)) >= 2
  • 主查询获取这些用户在2021年的所有作答记录
  • 结果包含三列:uid(用户ID)、exam_id(试卷ID)、start_time(作答日期)

2. 第二个CTE:max_avg_temp

max_avg_temp as (selectu1.uid,(selectcount(start_time)fromuser_with_multiple_dayswhereuid = u1.uid) / max(datediff(u2.start_time, u1.start_time) + 1) as max_avgfromuser_with_multiple_days u1join user_with_multiple_days u2 on u1.uid = u2.uidand u1.start_time < u2.start_timegroup byu1.uid
)

功能​:计算每个用户的日均作答量

详细说明​:

  • 通过自连接找出每个用户的所有作答日期组合(u1.start_time < u2.start_time
  • 计算每个用户的总作答次数(子查询中的count(start_time)
  • 计算最大日期跨度(max(datediff(u2.start_time, u1.start_time) + 1)
  • 用总作答次数除以最大日期跨度得到日均作答量(max_avg

3. 第三个CTE:max_windows_temp

max_windows_temp as (selectuid,max(days_window) as days_windowfrom(selectuid,start_time,datediff(start_time,lag(start_time) over (partition byuidorder bystart_time asc)) + 1 as days_windowfromuser_with_multiple_days) as t1group byuid
)

功能​:计算每个用户连续两次作答的最大时间窗

详细说明​:

  • 使用窗口函数lag()获取每个用户的上一次作答日期
  • datediff(start_time, lag(start_time)) + 1计算相邻两次作答的时间窗
    • +1是因为间隔2天实际上是3天的窗口(如1号和3号是3-1=2天,但实际窗口是3天)
  • max(days_window)找出每个用户的最大时间窗

最终查询

selectuid,days_window,round(days_window * max_avg, 2) as avg_exam_cnt
frommax_avg_tempjoin max_windows_temp using (uid)
order bydays_window desc,avg_exam_cnt desc

逻辑​:

  • 将最大时间窗(days_window)乘以日均作答量(max_avg)
  • 预测在该时间窗内平均会做多少套试卷(avg_exam_cnt)
  • 按最大时间窗和预测作答量降序排序

简化1

待补充。。。

http://www.xdnf.cn/news/15186.html

相关文章:

  • 【C语言】学习过程教训与经验杂谈:思想准备、知识回顾(六)
  • Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
  • kotlin中集合的用法
  • nmap扫描指定网段中指定开放端口的主机(IP,mac地址)
  • wps怎样正常显示毫秒时间
  • Spring Boot 与 Docker 的完美结合:容器化你的应用
  • 深入理解区块链 | 去中心化架构与密码学保障
  • html的outline: none;
  • 杰赛S65_中星微ZX296716免拆刷机教程解决网络错误和时钟问题
  • 智能体决策机制深度剖析:ReAct、Plan-and-Execute与自适应策略
  • Linux 服务器挖矿病毒深度处理与防护指南
  • 数字孪生技术为UI前端赋能:实现产品设计的快速原型验证
  • SDR(软件定义无线电)与软件定义声学系统详解
  • Idea如何解决包冲突
  • Unreal Engine 自动设置图像
  • Docker高级管理
  • C++面试冲刺笔记1:虚函数的基本工作原理
  • Java项目集成Log4j2全攻略
  • 【深度学习】【入门】Sequential的使用和简单神经网络搭建
  • 一天一道Sql题(day05)
  • 计蒜客T3473丑数、Leetcode2401最长优雅子数组、Leetcode167两数之和、Leetcode581最短无序连续子数组
  • Python Day8
  • 第6章应用题
  • C++内存泄露排查
  • 基于DeepSeek构建的openGauss AI智能优化助手:数据库性能提升新利器
  • 数据分析-名词
  • react16-react19都更新哪些内容?
  • 爬虫-数据解析
  • RapidRAW RAW 图像编辑器
  • claude code调用(免费白嫖100额度)