TSQL如何统计出发但未抵达(行程取消)的车辆总数量?
SQL Server TSQL 行程取消车辆统计解决方案
核心判定逻辑:同一事件(eventnumber)下的同一车辆(vehicle)存在onway(已出发)状态记录,且无对应arrived(已抵达)状态记录,即判定为行程取消。
以下为两种可直接落地的实现方案(假设业务表名为trip_events,可替换为实际表名):
方案1:NOT EXISTS 实现(性能优先推荐)
逻辑直观,搭配eventnumber + vehicle + status联合索引时查询效率最优:
SELECT COUNT(DISTINCT vehicle) AS canceled_vehicle_count FROM trip_events t_onway WHERE t_onway.status = 'onway' AND NOT EXISTS ( SELECT 1 FROM trip_events t_arrived WHERE t_arrived.eventnumber = t_onway.eventnumber AND t_arrived.vehicle = t_onway.vehicle AND t_arrived.status = 'arrived' )
针对你提供的示例数据,该查询返回结果为2,完全匹配预期输出。
方案2:GROUP BY + HAVING 实现(适合需要明细的场景)
如果需要同时查询所有符合条件的事件、车辆明细,可使用该方案:
-- 查看行程取消的车辆明细 SELECT eventnumber, vehicle FROM trip_events GROUP BY eventnumber, vehicle HAVING -- 存在出发记录 SUM(CASE WHEN status = 'onway' THEN 1 ELSE 0 END) > 0 -- 无抵达记录 AND SUM(CASE WHEN status = 'arrived' THEN 1 ELSE 0 END) = 0 -- 直接统计取消车辆总数 SELECT COUNT(*) AS canceled_vehicle_count FROM ( SELECT 1 FROM trip_events GROUP BY eventnumber, vehicle HAVING SUM(CASE WHEN status = 'onway' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN status = 'arrived' THEN 1 ELSE 0 END) = 0 ) t
注意事项
如果业务场景存在同一车辆同一事件多次出发/抵达的情况,可结合cdts时间戳字段增加时间维度的判定逻辑,避免统计误差。
内容的提问来源于stack exchange,提问作者Likemike90
相关产品推荐
相关产品推荐

