分桶排序算法在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

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

拜了个拜

目录
相关文章
|
13天前
|
数据采集 算法 数据可视化
基于Python的k-means聚类分析算法的实现与应用,可以用在电商评论、招聘信息等各个领域的文本聚类及指标聚类,效果很好
本文介绍了基于Python实现的k-means聚类分析算法,并通过微博考研话题的数据清洗、聚类数量评估、聚类分析实现与结果可视化等步骤,展示了该算法在文本聚类领域的应用效果。
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
116 65
|
3天前
|
存储 人工智能 自然语言处理
算法、系统和应用,三个视角全面读懂混合专家(MoE)
【8月更文挑战第17天】在AI领域,混合专家(MoE)模型以其独特结构成为推动大型语言模型发展的关键技术。MoE通过动态选择专家网络处理输入,实现条件计算。稀疏型MoE仅激活部分专家以减少计算负担;软MoE则加权合并专家输出提升模型稳定性。系统层面,MoE优化计算、通信与存储,利用并行化策略提高效率。在NLP、CV、推荐系统等领域展现强大应用潜力,但仍面临训练稳定性、可解释性等挑战。[论文链接: https://arxiv.org/pdf/2407.06204]
142 63
|
4天前
|
缓存 算法 Java
刷算法,你应该知道的队列经典应用
文章介绍了队列的基本特性和经典应用,包括如何用队列实现栈、使用优先级队列解决Top K问题,并通过LeetCode题目示例展示了队列在算法实现中的应用。
刷算法,你应该知道的队列经典应用
|
5天前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
12天前
|
机器学习/深度学习 人工智能 算法
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
本文全面介绍了人工智能(AI)的基础知识、操作教程、算法实现及其在实际项目中的应用。首先,从AI的概念出发,解释了AI如何使机器具备学习、思考、决策和交流的能力,并列举了日常生活中的常见应用场景,如手机助手、推荐系统、自动驾驶等。接着,详细介绍了AI在提高效率、增强用户体验、促进技术创新和解决复杂问题等方面的显著作用,同时展望了AI的未来发展趋势,包括自我学习能力的提升、人机协作的增强、伦理法规的完善以及行业垂直化应用的拓展等...
96 3
AI入门必读:Java实现常见AI算法及实际应用,有两下子!
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
【深度学习】探讨最新的深度学习算法、模型创新以及在图像识别、自然语言处理等领域的应用进展
深度学习作为人工智能领域的重要分支,近年来在算法、模型以及应用领域都取得了显著的进展。以下将探讨最新的深度学习算法与模型创新,以及它们在图像识别、自然语言处理(NLP)等领域的应用进展。
14 6
|
1天前
|
机器学习/深度学习 自然语言处理 负载均衡
揭秘混合专家(MoE)模型的神秘面纱:算法、系统和应用三大视角全面解析,带你领略深度学习领域的前沿技术!
【8月更文挑战第19天】在深度学习领域,混合专家(Mixture of Experts, MoE)模型通过整合多个小型专家网络的输出以实现高性能。从算法视角,MoE利用门控网络分配输入至专家网络,并通过组合机制集成输出。系统视角下,MoE需考虑并行化、通信开销及负载均衡等优化策略。在应用层面,MoE已成功应用于Google的BERT模型、Facebook的推荐系统及Microsoft的语音识别系统等多个场景。这是一种强有力的工具,能够解决复杂问题并提升效率。
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】线性回归模型:数据结构、算法详解与人工智能应用,附代码实现
线性回归是一种预测性建模技术,它研究的是因变量(目标)和自变量(特征)之间的关系。这种关系可以表示为一个线性方程,其中因变量是自变量的线性组合。
11 2
|
5天前
|
算法
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子
聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子