HiveSQL——统计当前时间段的有客人在住的房间数量

注:参考文章:

HiveSQL一天一个小技巧:如何统计当前时间点状态情况【辅助变量+累计变换思路】_sql查询统计某状态出现的次数及累计时间-CSDN博客文章浏览阅读2k次,点赞6次,收藏8次。本文总结了一种当前时间点状态统计的思路和方法,对于此类问题主要采用构造辅助计数变量及累加变换思路进行求解。常见的场景有:直播同时在线人数、服务器实时并发数、公家车当前时间段人数、某个仓库的货物积压数量,某一段时间内的同时处于服务过程中的最大订单量等_sql查询统计某状态出现的次数及累计时间https://blog.csdn.net/godlovedaniel/article/details/129881211

0 需求描述

 

 1 数据准备

create table if not exists table23
(user_id     int comment '用户id',room_num    string comment '房间号',in_time     string comment '入住时间',out_time    string comment '离店时间'
)comment '旅客入住离店表';insert overwrite table table23
values (7, '2004', '2021-03-05','2021-03-07'),(23,'2010', '2021-03-05','2021-03-06'),(7, '1003', '2021-03-07','2021-03-08'),(8, '2014', '2021-03-07','2021-03-08'),(14, '3001','2021-03-07','2021-03-10'),(18, '3002','2021-03-08','2021-03-10'),(23, '3020','2021-03-08','2021-03-09'),(25, '2006','2021-03-09','2021-03-12');

2 数据分析

   需求:求出每个时间段,有客人在住的房间数量。

   如果只考虑一人一房,可以借助于【直播间同时在线人数】统计的思路,相关sql逻辑指路:

HiveSQL题——聚合函数(sum/count/max/min/avg)-CSDN博客文章浏览阅读1.1k次,点赞19次,收藏19次。HiveSQL题——聚合函数(sum/count/max/min/avg)https://blog.csdn.net/SHWAITME/article/details/135918264?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170804307516800211583058%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=170804307516800211583058&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-135918264-null-null.nonecase&utm_term=%E7%9B%B4%E6%92%AD%E9%97%B4&spm=1018.2226.3001.4450  入住时间加辅助标记记为1,离店时间加辅助标记记为-1,并按照时间进行顺序排序,求当前累计值,具体SQL如下

selectstart_time,end_time,acc_cnt
from (select`time`                               as start_time,lead(`time`) over ( order by `time`) as end_time,acc_cntfrom (select`time`,sum(flag) over (order by `time`) as acc_cntfrom (selectin_time as `time`,1   as flagfrom table23union allselectout_time as `time`,-1   as flagfrom table23) t1) t2group by `time`, acc_cnt) t
where end_time is not null;

   上述代码需要考虑一个问题:如果有多个人共住一房间,今天退了一个人,明天又退了一个人,后天的时候才退完,虽然这期间一直有人在退,但房间还是有人住的,这种情况是不是也算【有客人在住的房间】? 如果考虑上述情况,需要对累加的状态进行调整,此时需要考虑每个房间中截止当前时间的人数情况

第一步:先求出每个房间截至当前时间人数累计值,作为状态判断辅助条件

select`time`,room_num,sum( user_cnt) over (partition by room_num order by `time`) user_cnt
from (selectin_time as  `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as   `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1

第二步:基于累计的每个房间人数进行判断:如果房间有人就标记1,没有人时候就标记为-1。代码为:case when user_cnt > 0 时标记1,否则标记-1

select`time`,room_num,user_cnt,case when user_cnt > 0 then 1 else -1 end flag
from (select`time`,room_num,sum(user_cnt) over (partition by room_num order by `time`) user_cntfrom (selectin_time as `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1) t2;

第三步:基于第二步的结果,计算截止当前时间点的有人入住的房间数量 acc_cnt,SQL如下:

select`time`,room_num,user_cnt,case when user_cnt > 0 then 1 else -1 end flag,sum(case when user_cnt > 0 then 1 else -1 end) over (order by `time`) acc_cnt
from (select`time`,room_num,sum(user_cnt) over (partition by room_num order by `time`) user_cntfrom (selectin_time as `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1) t2;

 第四步:基于第三步的结果,对时间time 和截止当前时间点的有人入住的房间数量acc_cnt这两个字段进行去重,SQL如下:

select`time`,acc_cnt
from (select`time`,room_num,user_cnt,case when user_cnt > 0 then 1 else -1 end                             flag,sum(case when user_cnt > 0 then 1 else -1 end) over (order by `time`) acc_cntfrom (select`time`,room_num,sum(user_cnt) over (partition by room_num order by `time`) user_cntfrom (selectin_time as     `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as         `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1) t2) t3
group by `time`, acc_cnt

 

  第五步:基于第四步的结果,通过lead函数(对time字段往后偏移一行)求出当前数据的结束时间end_time,SQL如下:

select`time` as start_time,lead(`time`, 1) over (order by `time`) as end_time,acc_cnt
from (select`time`,acc_cntfrom (select`time`,room_num,user_cnt,case when user_cnt > 0 then 1 else -1 end                             flag,sum(case when user_cnt > 0 then 1 else -1 end) over (order by `time`) acc_cntfrom (select`time`,room_num,sum(user_cnt) over (partition by room_num order by `time`) user_cntfrom (selectin_time as     `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as         `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1) t2) t3group by `time`, acc_cnt) t4

   

  :基于第五步的结果,过滤掉end_time 是null的数据,SQL如下:

selectstart_time,end_time,acc_cnt
from (select`time`  as start_time,lead(`time`, 1) over (order by `time`) as end_time,acc_cntfrom (select`time`,acc_cntfrom (select`time`,room_num,user_cnt,case when user_cnt > 0 then 1 else -1 end as  flag,sum(case when user_cnt > 0 then 1 else -1 end) over (order by `time`) acc_cntfrom (select`time`,room_num,sum(user_cnt) over (partition by room_num order by `time`) user_cntfrom (selectin_time as `time`,room_num,count(user_id) user_cntfrom table23group by in_time, room_numunion allselectout_time as `time`,room_num,-1 * count(user_id) user_cntfrom table23group by out_time, room_num) t1) t2) t3group by `time`, acc_cnt) t4) t5
where end_time is not null;

3 小结

   针对【每个时间段的直播同时在线人数】 【每个时间段有客人在住的房间数量】这种类型的题目,本质是对(截至)当前时间点的状态统计。这种问题常见的解决思路是:对当前时间点的状态打标记flag,之后基于标记flag做开窗计算(结合窗口函数)或聚合计算

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/471795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux第56步_根文件系统第3步_将busybox构建的根文件系统烧录到EMMC

1、第1次将“rootfs”打包 1)、打开第1个终端,准备在“mnt”目录下创建挂载目录“rootfs”; 输入“ls回车” 输入“cd /mnt回车” 输入“ls回车”,查看“mnt”目录下的文件和文件夹 输入“sudo mkdir rootfs回车”,在“mnt”…

阿里云/腾讯云幻兽帕鲁服务器据点最大帕鲁工作数量最多15个,改成20不生效?

例如,在阿里云的计算巢管理中,找到你的这台部署幻兽帕鲁的服务器实例,选择右上角的“修改游戏配置” 然后选择“基地内工作帕鲁的最大数量”改成20 有人说更改上面的数字,根本不起作用。原因可能如下: 参考资料&#…

LabVIEW焊缝缺陷超声检测与识别

LabVIEW焊缝缺陷超声检测与识别 介绍基于LabVIEW的焊缝缺陷超声检测与识别系统。该系统利用LabVIEW软件和数据采集卡的强大功能,实现了焊缝缺陷的在线自动检测,具有通用性、模块化、功能化和网络化的特点,显著提高了检测的效率和准确性。 随…

双输入宽带混合 Doherty-Outphasing功率放大器设计(2021.02 MTT)-从理论到ADS版图

基于双输入的宽带混合 Doherty-Outphasing功率放大器设计(2021.02 MTT)-从理论到ADS版图 原文: Wideband Two-Way Hybrid Doherty Outphasing Power Amplifier 发表于FEBRUARY 2021,在微波顶刊IEEE T MTT上面,使用的GAN CGH40010F 全部工程下载&#…

Unity笔记:第三人称Starter Asset代码学习

前言 什么是Third Person Starter Asset 自己看了几篇文章和视频,写了个人物移动脚本,有很多瑕疵。这个时候研究一下优秀的代码总是好的,Unity官方有Third Person Starter Asset可供研究,其官方商店页面是:Starter A…

Spring Boot 笔记 020 redis集成

1.1 安装redis Windows 下 Redis 安装与配置 教程_redis windows-CSDN博客 2.1 引入redis坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.2 配置…

482. License Key Formatting(密钥格式化)

问题描述 给定一个许可密钥字符串 s&#xff0c;仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n 1 组。你也会得到一个整数 k 。 我们想要重新格式化字符串 s&#xff0c;使每一组包含 k 个字符&#xff0c;除了第一组&#xff0c;它可以比 k 短&#xff0c;但…

opencv鼠标响应与操作

这节讲得好,建议仔细揣摩 Point sp(-1, -1);//初始位置 Point ep(-1, -1);//结束位置 Mat temp; static void on_draw(int event, int x, int y, int flags, void * userdata) {Mat image *((Mat*)userdata);//先将void类型转为Mat类型//((Mat*)userdata)是Mat类型指针 前面加…

B端系统升级方案模板:针对美观性和体验性升级(总体方案)

大家好&#xff0c;我是大美B端工场&#xff0c;专注于前端开发和UI设计&#xff0c;有需求可以私信。本篇从全局分享如何升级B端系统&#xff0c;搞B端系统升级的有个整体思维&#xff0c;不是说美化几个图标&#xff0c;修改几个页面就能解决的&#xff0c;这个方案模板&…

JavaScript_00001_00000

contents 简介变量与数据类型自动类型转换强制类型转换 简介 变量与数据类型 根据变量定义的范围不同&#xff0c;变量有全局变量和局部变量之分。直接定义的变量是全局变量&#xff0c;全局变量可以被所有的脚本访问&#xff1b;在函数里定义的变量称为局部变量&#xff0c;…

自动化测试定位不到元素怎么办?

1.动态id定位不到元素 分析原因&#xff1a;每次打开页面&#xff0c;ID都会变化。用ID去找元素&#xff0c;每次刷新页面ID都会发生变化。 解决方案&#xff1a;推荐使用xpath的相对路径方法或者cssSelector查找到该元素。 2.iframe原因定位不到元素 分析原因&#xff1a;…

Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库 AGP 8. 根目录的 settings.gradle dependencyResolutionManagement {...repositories {...maven { url https://jitpack.io }} } AGP 8. 根目录如果是 settings.gradle.kts 文件 dependencyResolutionManagement {...repositories {...…