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

SQL典型练习题

with可以解决很多想用子表解决的问题

over可以加想加的,改变表的结构

例题:

表(driver)说明:司机登录登出明细表,由于同一司机有可能同时登录两个司机端,所以同一时间段一个司机有可能会产生两条或者更多条数据。

字段名 描述 类型:

driver_id 司机id bigint

login 登录时间 yyyy-mm-dd HH:MM:SS

exit 下线时间 yyyy-mm-dd HH:MM:SS

题目:请你统计2024年8月1日后的所有司机在线时长,要求对司机时间去重,每个司机在线时长精确到秒。

注:我们保证在8月1日0时做了一次司机清场,即保证不会有司机8月1日之前登录8月1日之后退出的情况出现。

法一:利用lead()加一列有效退出时间

法二:with语句

WITH driver_time AS (SELECT driver_id, login AS event_time, 1 AS flagFROM driverWHERE login >= '2024-08-01'UNION ALLSELECT driver_id, exit AS event_time, -1 AS flagFROM driverWHERE exit >= '2024-08-01'-- 给出登录和登出的标志
),
driver_status AS (SELECT driver_id,event_time,SUM(flag) OVER (PARTITION BY driver_id ORDER BY event_time) AS online_statusFROM driver_time-- 给出在线状态
),
driver_intervals AS (SELECT driver_id,event_time AS start_time,LEAD(event_time) OVER (PARTITION BY driver_id ORDER BY event_time) AS end_time,online_statusFROM driver_status-- 用了lead()
)
SELECT driver_id,SUM(TIMESTAMPDIFF(SECOND, start_time, end_time)) AS total_online_duration_seconds
FROM driver_intervals
WHERE online_status > 0
AND end_time IS NOT NULL
GROUP BY driver_id;

driver_id  event_time         flag online_status end_time

001  '2024-08-01 07:00:00'   1  1   '2024-08-01 08:00:00'

001  '2024-08-01 08:00:00'   1  2   '2024-08-01 09:00:00'

001  '2024-08-01 09:00:00'  -1  1   '2024-08-01 10:00:00'

001  '2024-08-01 10:00:00' -1  0   '2024-08-01 11:00:00'

001  '2024-08-01 11:00:00'   1   1  '2024-08-01 12:00:00'

001  '2024-08-01 12:00:00'  -1   0  null

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 云渲染解决:笔记本渲染很伤电脑吗?如何保护你的电脑?
  • 【计算机组成原理】2.2.6 数据的存储和排列
  • Linux Ubuntu 桌面环境概览
  • 【视频讲解】主成分分析原理与水果成熟数据实例:Python中PCA-LDA 与卷积神经网络CNN...
  • OpenAI 将向企业开放 GPT-4o 模型定制版
  • SQL进阶技巧:如何按任意时段分析时间区间问题? | 分区间讨论【左、中、右】
  • 汽车小程序怎么做 汽车服务小程序系统开发制作方法
  • python自动化脚本:让工作自动化起来
  • 视频活码的快捷制作方法,轻松将多种格式视频生码
  • CPU、MPU、MCU、SOC分别是什么?
  • vue2.0纯前端预览附件方法汇总
  • Linux | 探究C语言文件接口与Linux系统文件接口的区别与联系 | fopen和open的区别与联系
  • vue预览全景图片
  • 【设计模式之原型模式——矩形原型】
  • javacv-ffmpeg ProcessBuilder实现对图片的旋转
  • 230. Kth Smallest Element in a BST
  • Android开源项目规范总结
  • HTTP 简介
  • Java 最常见的 200+ 面试题:面试必备
  • Laravel 中的一个后期静态绑定
  • Less 日常用法
  • MQ框架的比较
  • session共享问题解决方案
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 大型网站性能监测、分析与优化常见问题QA
  • 基于webpack 的 vue 多页架构
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 区块链将重新定义世界
  • ###项目技术发展史
  • #传输# #传输数据判断#
  • #图像处理
  • #职场发展#其他
  • (4)logging(日志模块)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (回溯) LeetCode 78. 子集
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (原创)可支持最大高度的NestedScrollView
  • (转)Windows2003安全设置/维护
  • ***检测工具之RKHunter AIDE
  • *上位机的定义
  • .“空心村”成因分析及解决对策122344
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 2.1路线图
  • .net core docker部署教程和细节问题
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET IoC 容器(三)Autofac
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 中创建支持集合初始化器的类型
  • .NET建议使用的大小写命名原则