简体   繁体   English

Hive SQL 按状态变化查询

[英]Hive SQL query by status change

vehicle车辆 record_time记录时间 charging_state充电状态
TEST0000000000001测试0000000000001 2022-12-28 14:55:54.0 2022-12-28 14:55:54.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 15:00:00.0 2022-12-28 15:00:00.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 15:16:10.0 2022-12-28 15:16:10.0 3 3个
12100000000000002 12100000000000002 2022-12-28 15:37:11.0 2022-12-28 15:37:11.0 0 0
12100000000000002 12100000000000002 2022-12-28 15:40:34.0 2022-12-28 15:40:34.0 0 0
12100000000000002 12100000000000002 2022-12-28 15:41:50.0 2022-12-28 15:41:50.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 15:45:30.0 2022-12-28 15:45:30.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 15:51:46.0 2022-12-28 15:51:46.0 3 3个
TEST0000000000002测试0000000000002 2022-12-28 15:57:16.0 2022-12-28 15:57:16.0 2 2个
TEST0000000000002测试0000000000002 2022-12-28 15:57:39.0 2022-12-28 15:57:39.0 0 0
TEST0000000000001测试0000000000001 2022-12-28 15:57:47.0 2022-12-28 15:57:47.0 0 0
TEST0000000000002测试0000000000002 2022-12-28 16:02:41.0 2022-12-28 16:02:41.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 16:02:48.0 2022-12-28 16:02:48.0 3 3个
TEST0000000000002测试0000000000002 2022-12-28 16:08:03.0 2022-12-28 16:08:03.0 3 3个
12100000000000002 12100000000000002 2022-12-28 16:17:34.0 2022-12-28 16:17:34.0 0 0
TEST0000000000002测试0000000000002 2022-12-28 16:24:18.0 2022-12-28 16:24:18.0 2 2个
TEST0000000000002测试0000000000002 2022-12-28 16:27:43.0 2022-12-28 16:27:43.0 2 2个
12100000000000002 12100000000000002 2022-12-28 16:29:22.0 2022-12-28 16:29:22.0 0 0
12100000000000002 12100000000000002 2022-12-28 16:32:44.0 2022-12-28 16:32:44.0 0 0
TEST0000000000001测试0000000000001 2022-12-28 16:34:17.0 2022-12-28 16:34:17.0 3 3个
TEST0000000000001测试0000000000001 2022-12-28 16:34:36.0 2022-12-28 16:34:36.0 3 3个
TEST0000000000002测试0000000000002 2022-12-28 16:35:02.0 2022-12-28 16:35:02.0 0 0
TEST0000000000002测试0000000000002 2022-12-28 16:35:08.0 2022-12-28 16:35:08.0 2 2个
TEST0000000000001测试0000000000001 2022-12-28 16:41:28.0 2022-12-28 16:41:28.0 3 3个
TEST0000000000002测试0000000000002 2022-12-28 16:42:34.0 2022-12-28 16:42:34.0 2 2个
TEST0000000000002测试0000000000002 2022-12-28 16:46:00.0 2022-12-28 16:46:00.0 2 2个
TEST0000000000001测试0000000000001 2022-12-28 16:46:23.0 2022-12-28 16:46:23.0 3 3个
TEST0000000000002测试0000000000002 2022-12-28 16:46:31.0 2022-12-28 16:46:31.0 2 2个
TEST0000000000001测试0000000000001 2022-12-28 16:46:48.0 2022-12-28 16:46:48.0 0 0
TEST0000000000002测试0000000000002 2022-12-28 17:14:27.0 2022-12-28 17:14:27.0 0 0
TEST0000000000001测试0000000000001 2022-12-28 17:14:41.0 2022-12-28 17:14:41.0 0 0
TEST0000000000002测试0000000000002 2022-12-28 17:18:58.0 2022-12-28 17:18:58.0 2 2个

charging_state == 0 means charging charging_state == 0表示正在充电

I want to find out the count of all charge ends.我想找出所有充电结束的次数。

For each vehicle the previous data charging_state == 0 and the next data charging_state != 0 .对于每辆车,前一个数据charging_state == 0和下一个数据charging_state != 0

The result of the sample data should be样本数据的结果应该是

vehicle车辆 count数数
TEST0000000000001测试0000000000001 1 1个
12100000000000002 12100000000000002 1 1个
TEST0000000000002测试0000000000002 3 3个

Assuming this is hive, you can use lead() to get next charging status and then compare them to calculate change of status.假设这是 hive,您可以使用lead()获取下一个充电状态,然后比较它们以计算状态变化。

select vehicle, 
sum( case when charging_state=0 and nvl(next_charging_state,0)<>0 then 1 else 0 end) as cnt
from (
select vehicle, charging_state, lead(charging_state) over (partition by vehicle order by vehicle,record_time ) as next_charging_state from mytable) rs
group by 1

Inner query will calculate a row and next row's status and Outer query will compare them and get a count of status change from 0 to anything else.内部查询将计算一行和下一行的状态,外部查询将比较它们并获得从 0 到其他任何状态变化的计数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM