SQL实战从在职到离职(1) 如何处理连续查询
书接上回,最近离职在家了实在无聊,除了看看考研的书,打打dnf手游,也就只能写写代码,结果昨晚挂在某平台的一个技术出售有人下单了,大概业务是需要帮忙辅导一些面试需要用到的SQL。
回想了下,在该平台接单SQL也超过3w元了,考察的也就是那几大类,我准备开一个新的专题,把我遇到的题目做一些示例和总结,欢迎大家指正。
今日主题:连续数据的查询
场景
场景一:需要查询最大连续签到的时长,一般用于toc的场景中
场景二:查询连续人流量超过2w的日期,某游乐场的业务管理系统
思路
这种题目我一般常用的思路就是动转静,连续转不变。
比如场景二,需要找连续的日期,那么就要再找一个连续的变量,让两个变量进行相减或者其他操作,得到不变的数据,然后通过分组或者分区查询即可。
例题
体育馆人流量表
| 列名 | 类型 |
|---|---|
| id | int |
| visit_date | date |
| people | int |
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,id与日期递增,日期不一定是连续递增。
编写SQL找出每天的人数大于或等于 100 且 日期 连续的三行或更多行记录。返回按 visit_date 升序排列 的结果表
Scheme:
Create table If Not Exists Stadium (id int, visit_date DATE NULL, people int)
Truncate table Stadium
insert into Stadium (id, visit_date, people) values ('1', '2017-01-01', 10)
insert into Stadium (id, visit_date, people) values ('2', '2017-01-02', 109)
insert into Stadium (id, visit_date, people) values ('3', '2017-01-03', 150)
insert into Stadium (id, visit_date, people) values ('4', '2017-01-04', 99)
insert into Stadium (id, visit_date, people) values ('5', '2017-01-05', 145)
insert into Stadium (id, visit_date, people) values ('6', '2017-01-06', 1455)
insert into Stadium (id, visit_date, people) values ('7', '2017-01-07', 199)
insert into Stadium (id, visit_date, people) values ('8', '2017-01-09', 188)
例题解释
体育馆的人流表,要求找出最少三天连续人流量超过100的数据,并且按照
visit_date升序排序。
实战
做题目前先回顾下SqlServer中的一个函数
DATEADD(DAY,2,'2020-03-27');
该函数可以在日期上进行加减,并且可以执行加减的日期部分,DAY表示天数增加。
按照思路,日期连续,那么可以生成一列行号,用日期与行号作差,如果结果相等则表示连续。
解题 生成行号
需要自己创造动态列,比如自己添加行号列
至于为什么不用ID,id也是递增的,我们做完再讲。
SELECT t1.id,t1.visit_date,t1.people FROM (
SELECT t.*, COUNT(1) OVER(partition by DATEADD(DAY, t.rowId * -1,t.visit_date)) AS daysCount FROM
(SELECT *,ROW_NUMBER() Over (ORDER BY id) as rowId FROM Stadium where people >= 100) t
) t1 WHERE t1.daysCount > =3
步骤
1.筛选人流量大于等于100的数据,并且通过分区函数增加行号
2.用日期减去行号得到一个日期,相等则表示日期连续,再次通过分区函数基于得到的日期获取分区数量
3.筛选分区数量大于等于3的就是连续三天或者三天以上人流量大于等于100的数据
4.作为子查询结果处理得到结果。
结果

为什么不用id还是需要自己创造行号。因为筛选掉人流量不够的数据后,id与时间的等差结果还是不会变,就会得到错误的数据,本身不满足的数据仍旧会被查询出来。
SQL实战从在职到离职(1) 如何处理连续查询的更多相关文章
- 第8章 Spark SQL实战
第8章 Spark SQL实战 8.1 数据说明 数据集是货品交易数据集. 每个订单可能包含多个货品,每个订单可以产生多次交易,不同的货品有不同的单价. 8.2 加载数据 tbStock: scala ...
- 牛客网数据库SQL实战解析(51-61题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(41-50题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(31-40题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(21-30题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(11-20题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- 牛客网数据库SQL实战解析(1-10题)
牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...
- MySQL:怒刷牛客网“sql实战”
MySQL:怒刷牛客网"sql实战" 在对MySQL有一定了解后,抽空刷了一下 牛客网上的 数据库SQL 实战,在此做一点小小的记录 SQL1 查找最晚入职员工的所有信息 sele ...
- 106_Power Pivot之HR入离调转、在职、离职率相关指标
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 之前有帮公司HR做了些员工入离调转.在职.人工成本分析等(体量:4000人左右).在和其他朋友交流的时候得知,貌 ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
随机推荐
- 探索Semantic Plugins:开启大模型的技能之门
前言 在之前的章节中我们或多或少的已经接触到了 Semantic Kernel 的 Plugins,本章我们讲详细介绍如何使用插件. Semantic Kernel 的一大特点是拥有强大的插件,通过结 ...
- react类组件
使用ES6语法的class创建的组件(有状态组件) 类名称必须要大写字母开头 类组件要继承React.Component父类,从而可以使用父类中提供的方法或者属性 类组件必须提供 render 方法, ...
- Windows 预览体验计划显示空白
Open PowerShell as Administator.In the elevated PowerShell window, copy and paste the following comm ...
- nginx rewrite实践
nginx rewrite跳转(高级) 官网 https://nginx.org/en/docs/http/ngx_http_rewrite_module.html 该ngx_http_rewrite ...
- Vue学习:19.插槽实例
来个简单示例练练手吧. 实例:插槽实例 思路 在封装表格组件时,通常使用默认插槽和作用域插槽来处理固定的自定义结构. 代码 根组件(APP.vue) <template> <div& ...
- 增补博客 第八篇 python 中国大学排名数据分析与可视化
[题目描述]以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:(1)按照排名先后顺序输出不同年份的前10位大学信息, ...
- 汽车生产车间PMC组态画面应该怎么设计
通常我们所说的汽车制造四大工艺指的是:冲压.焊装.涂装.总装.一般来说,在汽车制造工厂,这四大工艺分别对应四大车间.本文结合一些实际应用案例,向大家展示一下 TopStack 在汽车制造业各工艺车间中 ...
- 上交大开源镜像站下架 Docker Hub 镜像
在现代软件开发中,Docker镜像已经成为不可或缺的工具.然而,最近频频出现的Docker镜像下架事件让许多开发者措手不及.突然失去依赖的镜像,不仅打乱了项目进程,还引发了许多不便.那么,面对Do ...
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Asset Store Kit
1.问题描述 使用关键资产API需要配置SystemCapability.Security.Asset,但不知道syscap.json文件应该配置在哪里,文档也没找到. 解决方案 新增关键资产等API ...
- 深入理解Spring AOP中的@EnableAspectJAutoProxy
本文分享自华为云社区<Spring高手之路20--深入理解@EnableAspectJAutoProxy的力量>,作者: 砖业洋__. 1. 初始调试代码 面向切面编程(AOP)是一种编程 ...