书接上回,最近离职在家了实在无聊,除了看看考研的书,打打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) 如何处理连续查询的更多相关文章

  1. 第8章 Spark SQL实战

    第8章 Spark SQL实战 8.1 数据说明 数据集是货品交易数据集. 每个订单可能包含多个货品,每个订单可以产生多次交易,不同的货品有不同的单价. 8.2 加载数据 tbStock: scala ...

  2. 牛客网数据库SQL实战解析(51-61题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  3. 牛客网数据库SQL实战解析(41-50题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  4. 牛客网数据库SQL实战解析(31-40题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  5. 牛客网数据库SQL实战解析(21-30题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  6. 牛客网数据库SQL实战解析(11-20题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  7. 牛客网数据库SQL实战解析(1-10题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  8. MySQL:怒刷牛客网“sql实战”

    MySQL:怒刷牛客网"sql实战" 在对MySQL有一定了解后,抽空刷了一下 牛客网上的 数据库SQL 实战,在此做一点小小的记录 SQL1 查找最晚入职员工的所有信息 sele ...

  9. 106_Power Pivot之HR入离调转、在职、离职率相关指标

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 之前有帮公司HR做了些员工入离调转.在职.人工成本分析等(体量:4000人左右).在和其他朋友交流的时候得知,貌 ...

  10. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

随机推荐

  1. css 跑马灯

    html: <view class="in_scro"> <view class="in_scrview">恭喜139******1用户 ...

  2. k8s——搭建集群环境

    服务器要求(三台都要操作) 一台master两台node 能连外网 关闭防火墙 关闭selinux 设置主机名,域名解析 关闭swap(记得关完之后重启) swapoff -a //临时关闭 vim ...

  3. Vulkan Support Check and Dynamic Loader C++ code sample

    很多时候不想静态依赖VulkanSDK所提供的静态库,因为会遇到一些过早的电脑不支持vulkan, 那么就需要使用动态加载vulkan-1.dll(for Windows)或libMoltenVK.d ...

  4. C#.NET FRAMEWORK XML私钥转PKCS1,PKCS8

    C#.NET FRAMEWORK XML私钥转PKCS1,PKCS8 使用了 BouncyCastle 这个dll ,到nuget中下载即可. XML私钥转PKCS1 public string Xm ...

  5. nfs笔记整理

    NFS---共享存储系统 #network file system 网络文件系统 ​ #NFS主要使用在局域网下,让不同的主机之间可以共享文件.或者目录数据.主要用于linux系统上实现文件共享的一种 ...

  6. Java原子操作保证方案

    引言 原子操作是指不会被线程调度机制打断的操作:这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程).通常所说的原子操作包括对非long和double ...

  7. Linux 下使用Java连接MySQL数据库,并且实现插入、删除、选择操作

    实验环境: OS : CentOS5.5 (Linux) IDE : Eclipse DBMS : MySQL 准备工作: 1.安装 MySql . 详见http://www.cnblogs.com/ ...

  8. RTThread 自动网卡使用问题

    最近使用 STM32 测试了一下 lwip 和 esp8266 的网络连接问题,使用 RTThread 的自动网卡时,发现不能很好的自动切换默认网卡,不能满足需求,所以自己简单的改了一下. 一.准备材 ...

  9. Xilinx ZYNQ-7000 平台简介

    平台介绍 Zynq7000是赛灵思公司(Xilinx)推出的行业第一个可扩展处理平台Zynq系列.旨在为视频监视.汽车驾驶员辅助以及工厂自动化等高端嵌入式应用提供所需的处理与计算性能水平. 在2010 ...

  10. 总结:软件开发的3个方向 与 嵌入式Linux学习路线(驱动方向)

    --- title: 嵌入式Linux学习路线图(驱动方向) date: 2020-05-09 07:17:58 categories: tags: - embeded - summary - arm ...