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

基于状态变化的Hive SQL查询:统计车辆充电结束次数

问题描述

现有车辆充电状态记录表,字段说明:

  • vehicle:车辆ID
  • record_time:记录时间
  • charging_state:充电状态(0表示充电中)

需要统计每辆车的充电结束次数,统计规则:

对于同一辆车,当某条数据的前一条数据charging_state == 0,且**后一条数据charging_state != 0**时,视为一次充电结束。

原始数据如下:

vehiclerecord_timecharging_state
TEST00000000000012022-12-28 14:55:54.03
TEST00000000000012022-12-28 15:00:00.03
TEST00000000000012022-12-28 15:16:10.03
121000000000000022022-12-28 15:37:11.00
121000000000000022022-12-28 15:40:34.00
121000000000000022022-12-28 15:41:50.03
TEST00000000000012022-12-28 15:45:30.03
TEST00000000000012022-12-28 15:51:46.03
TEST00000000000022022-12-28 15:57:16.02
TEST00000000000022022-12-28 15:57:39.00
TEST00000000000012022-12-28 15:57:47.00
TEST00000000000022022-12-28 16:02:41.03
TEST00000000000012022-12-28 16:02:48.03
TEST00000000000022022-12-28 16:08:03.03
121000000000000022022-12-28 16:17:34.00
TEST00000000000022022-12-28 16:24:18.02
TEST00000000000022022-12-28 16:27:43.02
121000000000000022022-12-28 16:29:22.00
121000000000000022022-12-28 16:32:44.00
TEST00000000000012022-12-28 16:34:17.03
TEST00000000000012022-12-28 16:34:36.03
TEST00000000000022022-12-28 16:35:02.00
TEST00000000000022022-12-28 16:35:08.02
TEST00000000000012022-12-28 16:41:28.03
TEST00000000000022022-12-28 16:42:34.02
TEST00000000000022022-12-28 16:46:00.02
TEST00000000000012022-12-28 16:46:23.03
TEST00000000000022022-12-28 16:46:31.02
TEST00000000000012022-12-28 16:46:48.00
TEST00000000000022022-12-28 17:14:27.00
TEST00000000000012022-12-28 17:14:41.00
TEST00000000000022022-12-28 17:18:58.02

预期统计结果:

vehiclecount
TEST00000000000011
121000000000000021
TEST00000000000023

解决方案

方法1:SQL实现

按车辆分组、记录时间排序,用窗口函数LAG()获取前一条充电状态,LEAD()获取后一条充电状态,筛选符合条件的记录并计数:

WITH ordered_data AS (
    SELECT 
        vehicle,
        charging_state,
        LAG(charging_state) OVER (PARTITION BY vehicle ORDER BY record_time) AS prev_state,
        LEAD(charging_state) OVER (PARTITION BY vehicle ORDER BY record_time) AS next_state
    FROM your_table_name
)
SELECT 
    vehicle,
    COUNT(*) AS count
FROM ordered_data
WHERE prev_state = 0 AND next_state != 0
GROUP BY vehicle
ORDER BY vehicle;

方法2:Python(Pandas)实现

先按车辆分组排序,计算前后状态后筛选统计:

import pandas as pd

# 假设数据已存入DataFrame df
df_sorted = df.sort_values(['vehicle', 'record_time'])

# 计算前后状态
df_sorted['prev_state'] = df_sorted.groupby('vehicle')['charging_state'].shift(1)
df_sorted['next_state'] = df_sorted.groupby('vehicle')['charging_state'].shift(-1)

# 统计符合条件的次数
result = df_sorted[(df_sorted['prev_state'] == 0) & (df_sorted['next_state'] != 0)] \
    .groupby('vehicle') \
    .size() \
    .reset_index(name='count')

print(result)

结果验证

两种方法都会得到与预期一致的结果:

  • TEST0000000000001:1次(对应15:57:47.0的0状态→16:02:48.0的3状态)
  • 12100000000000002:1次(对应15:40:34.0的0状态→15:41:50.0的3状态)
  • TEST0000000000002:3次(分别对应15:57:39.0→16:02:41.0、16:35:02.0→16:35:08.0、17:14:27.0→17:18:58.0三组状态变化)

内容的提问来源于stack exchange,提问作者jian gao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:30:34