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

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

拜了个拜

目录
相关文章
|
8天前
|
存储 负载均衡 算法
基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
38 15
|
14天前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
103 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
2天前
|
人工智能 自然语言处理 供应链
从第十批算法备案通过名单中分析算法的属地占比、行业及应用情况
2025年3月12日,国家网信办公布第十批深度合成算法通过名单,共395款。主要分布在广东、北京、上海、浙江等地,占比超80%,涵盖智能对话、图像生成、文本生成等多行业。典型应用包括医疗、教育、金融等领域,如觅健医疗内容生成算法、匠邦AI智能生成合成算法等。服务角色以面向用户为主,技术趋势为多模态融合与垂直领域专业化。
|
9天前
|
存储 人工智能 算法
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
阿里云向量检索服务Milvus 2.5版本在全文检索、关键词匹配以及混合检索(Hybrid Search)方面实现了显著的增强,在多模态检索、RAG等多场景中检索结果能够兼顾召回率与精确性。本文将详细介绍如何利用 Milvus 2.5 版本实现这些功能,并阐述其在RAG 应用的 Retrieve 阶段的最佳实践。
通过Milvus内置Sparse-BM25算法进行全文检索并将混合检索应用于RAG系统
|
16天前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
29 3
|
26天前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
49 12
|
24天前
|
算法 安全 网络安全
基于 Python 的布隆过滤器算法在内网行为管理中的应用探究
在复杂多变的网络环境中,内网行为管理至关重要。本文介绍布隆过滤器(Bloom Filter),一种高效的空间节省型概率数据结构,用于判断元素是否存在于集合中。通过多个哈希函数映射到位数组,实现快速访问控制。Python代码示例展示了如何构建和使用布隆过滤器,有效提升企业内网安全性和资源管理效率。
50 9
|
3天前
|
人工智能 自然语言处理 算法
从第九批深度合成备案通过公示名单分析算法备案属地、行业及应用领域占比
2024年12月20日,中央网信办公布第九批深度合成算法名单。分析显示,教育、智能对话、医疗健康和图像生成为核心应用领域。文本生成占比最高(57.56%),涵盖智能客服、法律咨询等;图像/视频生成次之(27.32%),应用于广告设计、影视制作等。北京、广东、浙江等地技术集中度高,多模态融合成未来重点。垂直行业如医疗、教育、金融加速引入AI,提升效率与用户体验。
|
16天前
|
算法 安全 Java
探讨组合加密算法在IM中的应用
本文深入分析了即时通信(IM)系统中所面临的各种安全问题,综合利用对称加密算法(DES算法)、公开密钥算法(RSA算法)和Hash算法(MD5)的优点,探讨组合加密算法在即时通信中的应用。
17 0

热门文章

最新文章