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.pswp.cn/web/88699.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88699.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88699.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorFlow2 study notes[2]

文章目录tf.autodiff.ForwardAccumulatorreferencestf.autodiff.ForwardAccumulator the function can be used to achieve the Computation of Jacobian-vector products with forward-mode autodiff. primals is variables need to watch.tangents is direction vector. …

稳定币将成为新时代的重要金融工具

在数字经济加速渗透的今天,加密货币作为一种新型价值载体,正深刻改变着全球金融的运作逻辑。其中,稳定币与非稳定币构成了加密货币生态的两大支柱,二者在设计逻辑、应用场景和市场表现上呈现出显著差异。 稳定币锚定法定货币 稳定币是一类以法定货币、大宗商品或其他资产…

Constants

本节是《Solidity by Example》的中文翻译与深入讲解&#xff0c;专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 解说 提示”的方式&#xff0c;带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。 Solidity 是以太坊等智能合约平台使用的主要编程语…

五镜头倾斜摄影相机的技术优势与应用原理

倾斜摄影技术作为三维实景建模的核心手段&#xff0c;其硬件设计直接影响数据采集效率与模型质量。在众多镜头配置方案中&#xff0c;五镜头结构&#xff08;下视前、后、左、右四个倾斜视角&#xff09;已成为行业主流选择。这一设计并非偶然&#xff0c;而是基于严苛的技术需…

ThinkSound V2版 - 一键给无声视频配音,为AI视频生成匹配音效 支持50系显卡 一键整合包下载

ThinkSound 是阿里通义实验室开源的首个音频生成模型&#xff0c;它能够让AI像专业“音效师”一样&#xff0c;根据视频内容生成高度逼真、与视觉内容完美契合的音频。 ThinkSound 可直接应用于影视后期制作&#xff0c;为AI生成的视频自动匹配精准的环境噪音与爆炸声效&#x…

如何从0开始构建自己的第一个AI应用?(Prompt工程、Agent自定义、Tuning)

一、前言 从0开始基于自定义Agent构建AI应用&#xff0c;涉及从创建智能Agent到使用、测试及优化提示词等一系列步骤。前置&#xff1a;什么是LLM、Prompt、Mcp和Agent&#xff1f; 二、步骤一&#xff1a;规划和设计AI应用 在创建AI应用之前&#xff0c;你需要明确应用的目标…

Java ThreadLocal详解:从原理到实践

Java ThreadLocal详解&#xff1a;从原理到实践&#xff08;图解极简示例&#xff09; 一、什么是ThreadLocal&#xff1f;——线程的"专属储物柜" ThreadLocal 是 Java 提供的线程本地存储机制&#xff0c;通俗来说&#xff0c;它能为每个线程创建一个独立的变量副本…

如何在 Visual Studio Code 中使用 Cursor AI

在当今快节奏的开发环境中&#xff0c;像 Cursor AI 这样的 AI 工具正在彻底改变开发人员编写和管理代码的方式。Cursor AI 通过提供智能代码建议、自然语言编辑和多文件项目更新功能&#xff0c;增强了“ Visual Studio Code (VS Code )”的功能&#xff0c;所有这些功能均由 …

阿里面试:服务与发现 ,该选择 CP 还是 AP?为什么?

说在前面 最近有小伙伴拿到了一线互联网企业如微博、阿里、汽车之家、极兔、有赞、希音、百度、网易、滴滴的面试资格&#xff0c;遇到一几个很重要的面试题&#xff1a; 服务注册发现&#xff0c;该选 AP 还是 CP&#xff1f; 为什么&#xff1f; 最近有小伙伴在面 阿里。 小伙…

模拟实现Vue2-Vue3响应式更新

Vue2作为 MVVM框架/* Vue2 通过 Object.defineProperty 监听、挟持数据&#xff0c;实现响应式 并通过 Dep&#xff08;依赖收集器&#xff09; 和 Watcher 实现依赖收集&#xff0c;通知视图更新 *//* 但是 Vue2用Object.defineProperty 无法监听新增属性、无法监听数组索引变…

一文理解锂电池充电、过放修复与电量测量:从原理到实战

一、为什么要看这篇文章&#xff1f; 手机电量突然从20%跳到0%&#xff1f;电动车冬天续航腰斩&#xff1f;18650过放后还能救吗&#xff1f; 本文用一张思维导图一张表格一段口诀&#xff0c;一次性讲透锂电池的充电四阶段、过放修复全方案、电量测量底层原理&#xff0c;并给…

【爬虫】01 - 爬虫原理及其入门

爬虫01 - 爬虫原理及其入门 文章目录爬虫01 - 爬虫原理及其入门一&#xff1a;爬虫原理1&#xff1a;爬虫的优势‌2&#xff1a;爬虫的核心库3&#xff1a;经典举例4&#xff1a;合规问题一&#xff1a;爬虫原理 学习爬虫之前前置知识需要了解这些&#xff1a; 我的HTTP介绍, 了…

React对于流式数据和非流式数据的处理和优化

React 在处理流式数据和非流式数据时&#xff0c;可以借助其组件模型、状态管理以及 React 18 引入的并发特性来实现高效的数据处理与渲染优化。 文章目录一、流式数据&#xff08;Streaming Data&#xff09;1. 定义2. 常见来源3. 处理方式使用 useState / useReducer 管理状态…

3、Vue 中使用 Cesium 实现可拖拽点标记及坐标实时显示功能

在 Cesium 地图开发中&#xff0c;实现点标记的拖拽交互并实时显示坐标信息是一个常见的需求。本文将详细介绍如何在 Vue 框架中使用 Cesium 的 Primitive 方式创建点标记&#xff0c;并实现拖拽功能及坐标提示框跟随效果。先看效果图功能实现概述我们将实现的功能包括&#xf…

Anthropic:从OpenAI分支到AI领域的领军者

自2021年由前OpenAI高管Dario和Daniela Amodei创立以来&#xff0c;Anthropic已迅速崛起为人工智能&#xff08;AI&#xff09;领域的重要力量。 公司专注于开发安全、可控且具备深度推理能力的AI系统&#xff0c;其Claude系列模型在生成式AI领域取得了显著成就。 此外&#xf…

前端开发中的输出问题

前端开发中的输出问题&#xff1a;console.log输出[object Object]在前端开发中&#xff0c;一个常见问题是使用console.log输出对象时显示为[object Object]&#xff0c;而不是对象的详细内容。这通常发生在开发者试图直接打印对象时&#xff0c;浏览器默认只显示对象的字符串…

DSSA(Domain-Specific Software Architecture)特定领域架构

DSSA&#xff08;Domain-Specific Software Architecture&#xff09; 定义&#xff1a;针对特定应用领域设计的可复用软件架构&#xff0c;为领域内产品族提供统一基础。 目标&#xff1a; ✅ 最大化复用&#xff08;需求/设计/代码&#xff09;✅ 保证系统一致性✅ 降低开发成…

单调栈单调队列【算法进阶】

这周学完之后最大的收获就是单调栈和单调队列了&#xff01;&#xff01;&#xff01;感觉好厉害能把时间复杂度瞬间压缩为O(N)&#xff0c;不行我必须再纪念一下这么美妙的算法&#xff01;&#xff01;&#xff01; 单调栈问题&#xff1a; 如果题目要求一个元素左边或右边…

C++编程基础

编程题一问题分析 题目要求使用 n 根小木棒&#xff0c;按照特定的方式排列&#xff0c;形成一个数字。具体规则如下&#xff1a; 每个数字由小木棒组成&#xff0c;例如&#xff1a; 1 需要 2 根小木棒。0 需要 6 根小木棒。其他数字&#xff08;如 2, 3, 4, 5, 6, 7, 8, 9&am…

张量拼接操作

一.前言本章节来介绍一下张量拼接的操作&#xff0c;掌握torch.cat torch.stack使⽤&#xff0c;张量的拼接操作在神经⽹络搭建过程中是⾮常常⽤的⽅法&#xff0c;例如: 在后⾯将要学习到的残差⽹络、注意⼒机 制中都使⽤到了张量拼接。二.torch.cat 函数的使用torch.cat 函数…