You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 15:27:18