分桶排序算法在SQL中应用

简介: 分桶一词,大家应该不陌生,使用过Hive的同学都知道,hive里有个分通表,即针对某一列进行哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。写sql时将数据划分到对应组中进行分析也正是运用了分桶

业务需求分析中对数据按时序划分为不同的片段,针对相应片段进行分析的场景也有不少:停车时长、运行时长、断电时长等等。现结合实际需求的简化版来分析下如何运用分桶算法

案例:运输车辆上安装的有一设备可以监控到车辆启停状态,某天的监控状态数据如下表:device_id为设备id,device_time为设备上传数据的时间一秒一上传,ac_state为车辆启动停止的状态(1启动 0熄火),以下是模拟数据

device_id

device_time

ac_state

...

...

...

E1

1628317418

1

E1

1628317419

1

E1

1628317420

1

E1

1628317421

0

E1

1628317422

0

E1

1628317423

0

E1

1628317424

0

E1

1628317425

0

E1

1628317426

1

E1

1628317427

1

E1

1628317428

1

E1

1628317429

0

E1

1628317430

0

E1

1628317431

0

E1

1628317432

1

E1

1628317433

1

E1

1628317434

1

E2

1628317510

0

E2

1628317511

0

E2

1628317512

1

E2

1628317513

1

E2

1628317514

1

E2

1628317515

0

E2

1628317516

0

E2

1628317517

0

E2

1628317518

0

E2

1628317519

1

E2

1628317520

1

E2

1628317521

0

E2

1628317522

0

E2

1628317523

0

E2

1628317524

0

E2

1628317525

0

E2

1628317526

0

...

...

...

需要分析某天车辆停车次数、停车时长及停车开始和结束时间,如下表所示

date

device_id

power_off_ct

sn

power_off_duration

start_time

end_time

2021-08-07

E1

2

1

5

2021-08-07 14:23:41

2021-08-07 14:23:45

2021-08-07

E1

2

2

3

2021-08-07 14:23:49

2021-08-07 14:23:51

...

...

...

...

...

...

...

分析:观察数据就会发现ac_state字段已经分好组了,这在之前的分析就是一个标记列了(满足条件标记1不满足标记0),虽已经分好组但是不能直接根据这个组进行计算,我们需要将这个组重新分组并标注递增的组好,如何重新分组呢;我们先看下将ac_state整体往下移动一条数据的距离,会发现不同分组数据有交叉,有了这个交叉之后,可以对数据重新标记

image.png

新标记的一列数据进行累加,0值相加还未0,遇到1就累积增1,这就行成了分组效果,也即是将数据划分为不同的桶,可以利用sum(if)组合进行实现,这在之前的文章分析中已经直接用了但未做具体解释

image.png

  1. 首先生成示例数据
with tb1 as(select        device_id,        device_time,        ac_state
fromvalues('E1',1628317418,1),('E1',1628317419,1),('E1',1628317420,1),('E1',1628317421,0),('E1',1628317422,0),('E1',1628317423,0),('E1',1628317424,0),('E1',1628317425,0),('E1',1628317426,1),('E1',1628317427,1),('E1',1628317428,1),('E1',1628317429,0),('E1',1628317430,0),('E1',1628317431,0),('E1',1628317432,1),('E1',1628317433,1),('E1',1628317434,1),('E2',1628317510,0),('E2',1628317511,0),('E2',1628317512,1),('E2',1628317513,1),('E2',1628317514,1),('E2',1628317515,0),('E2',1628317516,0),('E2',1628317517,0),('E2',1628317518,0),('E2',1628317519,1),('E2',1628317520,1),('E2',1628317521,0),('E2',1628317522,0),('E2',1628317523,0),('E2',1628317524,0),('E2',1628317525,0),('E2',1628317526,0)               t(device_id,device_time,ac_state))
  1. 数据移动采用lag函数进行
tb2 as(select        device_id,        device_time,        ac_state,        from_unixtime(device_time)datetime,        lag(ac_state,1,1) over(partition by device_id orderby device_time) lag_ac_state
from tb1
)
  1. 使用sum(if)进行分桶
tb3 as(select        device_id,        device_time,        ac_state,datetime,        lag_ac_state,        sum(if(ac_state!=lag_ac_state,1,0)) over(partition by device_id orderby device_time) flag
from tb2
where ac_state =0--过滤全为0的数据方便进行分桶)--结果展示如下device_id device_time ac_state  datetime  lag_ac_state  flag
E1  162831742102021-08-0714:23:4111E1  162831742202021-08-0714:23:4201E1  162831742302021-08-0714:23:4301E1  162831742402021-08-0714:23:4401E1  162831742502021-08-0714:23:4501E1  162831742902021-08-0714:23:4912E1  162831743002021-08-0714:23:5002E1  162831743102021-08-0714:23:5102E2  162831751002021-08-0714:25:1011E2  162831751102021-08-0714:25:1101E2  162831751502021-08-0714:25:1512E2  162831751602021-08-0714:25:1602E2  162831751702021-08-0714:25:1702E2  162831751802021-08-0714:25:1802E2  162831752102021-08-0714:25:2113E2  162831752202021-08-0714:25:2203E2  162831752302021-08-0714:25:2303E2  162831752402021-08-0714:25:2403E2  162831752502021-08-0714:25:2503E2  162831752602021-08-0714:25:2603
  1. 计算停车次数
tb4 as(select        device_id,        device_time,        ac_state,datetime,        flag,        max(flag) over(partition by device_id) ct
from tb3
)
  1. 按设备和分桶号进行分组统计结果
select    substr(min(datetime),1,10)asdate,    device_id,    min(ct)as power_off_ct,    flag as sn,    max(device_time)-min(device_time)as power_off_duration,    min(datetime)as start_time,    max(datetime)as end_time
from tb4
groupby device_id,flag;--结果如下date  device_id power_off_ct  sn  power_off_duration  start_time  end_time
2021-08-07  E1  2142021-08-0714:23:412021-08-0714:23:452021-08-07  E1  2222021-08-0714:23:492021-08-0714:23:512021-08-07  E2  3112021-08-0714:25:102021-08-0714:25:112021-08-07  E2  3232021-08-0714:25:152021-08-0714:25:182021-08-07  E2  3352021-08-0714:25:212021-08-0714:25:26

以上就是分析过程,在业务分析过程中该方法能很好的解决类似需求,举一反三,希望能帮助到大家。

拜了个拜

目录
相关文章
|
2月前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
56 3
|
1天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
26 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
213 63
|
1天前
|
存储 缓存 算法
探索企业文件管理软件:Python中的哈希表算法应用
企业文件管理软件依赖哈希表实现高效的数据管理和安全保障。哈希表通过键值映射,提供平均O(1)时间复杂度的快速访问,适用于海量文件处理。在Python中,字典类型基于哈希表实现,可用于管理文件元数据、缓存机制、版本控制及快速搜索等功能,极大提升工作效率和数据安全性。
19 0
|
27天前
|
机器学习/深度学习 人工智能 算法
探索人工智能中的强化学习:原理、算法与应用
探索人工智能中的强化学习:原理、算法与应用
|
26天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
43 1
|
26天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
57 1
|
1月前
|
缓存 算法 网络协议
OSPF的路由计算算法:原理与应用
OSPF的路由计算算法:原理与应用
48 4
|
1月前
|
机器学习/深度学习 监控 算法
基于反光衣和检测算法的应用探索
本文探讨了利用机器学习和计算机视觉技术进行反光衣检测的方法,涵盖图像预处理、目标检测与分类、特征提取等关键技术。通过YOLOv5等模型的训练与优化,展示了实现高效反光衣识别的完整流程,旨在提升智能检测系统的性能,应用于交通安全、工地监控等领域。
|
1月前
|
存储 算法 网络协议
OSPF的SPF算法介绍:原理、实现与应用
OSPF的SPF算法介绍:原理、实现与应用
82 3