Oracle数据库SQL查询:统计车辆出行的不重复天数
纯SQL实现Oracle车辆不重复出行天数统计
核心逻辑
先提取每趟出行的日期维度(忽略时间部分),对单台车辆的出行日期去重后计数,同时关联车辆表保证所有车辆都能被统计(含无出行记录的车辆)。
基础场景SQL(无跨天出行)
SELECT v.id_vehicle, v.model, COUNT(DISTINCT TRUNC(t.dt_start)) AS unique_trip_days FROM tb_vehicle v LEFT JOIN tb_trip t ON v.id_vehicle = t.id_vehicle GROUP BY v.id_vehicle, v.model ORDER BY v.id_vehicle;
代码解析
TRUNC(t.dt_start):截断出行开始时间至日期部分,统一按自然日判断是否为同一天。COUNT(DISTINCT ...):对单台车辆的所有出行日期去重后统计数量,实现“同一天多次出行仅算1天”的要求。LEFT JOIN:确保无出行记录的车辆也会出现在结果中,此时unique_trip_days值为0。
跨天出行场景SQL
如果存在出行跨天的情况(如2024-05-20 23:00出发,2024-05-21 01:00结束),需要统计为2天的话,可使用以下SQL:
WITH trip_dates AS ( SELECT id_vehicle, TRUNC(dt_start) + LEVEL - 1 AS trip_date FROM tb_trip CONNECT BY LEVEL <= TRUNC(dt_end) - TRUNC(dt_start) + 1 AND PRIOR id_vehicle = id_vehicle AND PRIOR SYS_GUID() IS NOT NULL ) SELECT v.id_vehicle, v.model, COUNT(DISTINCT td.trip_date) AS unique_trip_days FROM tb_vehicle v LEFT JOIN trip_dates td ON v.id_vehicle = td.id_vehicle GROUP BY v.id_vehicle, v.model ORDER BY v.id_vehicle;
这段代码通过CTE将跨天出行拆分为涉及的每一天,再去重统计天数,适配跨天场景的需求。
内容的提问来源于stack exchange,提问作者jamisson
相关产品推荐
相关产品推荐

