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 flag
    FROM driver
    WHERE login >= '2024-08-01'
    UNION ALL
    SELECT driver_id, exit AS event_time, -1 AS flag
    FROM driver
    WHERE 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_status
    FROM 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_status
    FROM 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

相关推荐
ClickHouseDB14 小时前
ClickHouse Cloud 与 Snowflake 实时性价比对比:CostBench 测试中的 412 倍差距来
运维·数据库·系统架构
m0_6399069414 小时前
Redis入门|五种数据结构、使用场景、持久化RDB&AOF
数据结构·数据库·redis
时间售卖铺15 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
qetfw15 小时前
UOS MariaDB 数据库:安装、最小权限与备份验证
linux·数据库·mariadb·uos
数智园区合作社16 小时前
问数平台怎么把同一个指标锁成一个数
大数据·数据库·人工智能·ai
lbb 小魔仙16 小时前
Windows搭建PaddleOCR+飞书Webhook自动打卡通知机器人:识别、推送与远程触发完整教程
数据库·人工智能·prometheus·时序数据库
captain37617 小时前
MyBatis操作数据库(入门2)
java·数据库·spring boot·后端·spring·mybatis
心中有你021418 小时前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川18 小时前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组18 小时前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制