首页 > 数据库 >SQL实战从在职到离职(1) 如何处理连续查询

SQL实战从在职到离职(1) 如何处理连续查询

时间:2024-07-31 15:05:58浏览次数:13  
标签:01 Stadium people visit 在职 SQL date id 离职

书接上回,最近离职在家了实在无聊,除了看看考研的书,打打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.作为子查询结果处理得到结果。

结果
image

为什么不用id还是需要自己创造行号。因为筛选掉人流量不够的数据后,id与时间的等差结果还是不会变,就会得到错误的数据,本身不满足的数据仍旧会被查询出来。

标签:01,Stadium,people,visit,在职,SQL,date,id,离职
From: https://www.cnblogs.com/qwqwQAQ/p/18334689

相关文章

  • MySQL GTID详解
    MySQL在5.6版本推出了GTID复制,相比传统的复制,GTID复制对于运维更加友好,这个事物是谁产生,产生多少事物,非常直接的标识出来。今天将讨论一下关于从库showslavestatus中的Retrieved_Gtid_Set和Executed_Gtid_Set.Retrieved_Gtid_Set:从库已经接收到主库的事务编号Executed......
  • 尝试使用 pyodbc 连接到 SQL Server 数据库时出现操作错误
    我正在尝试使用Python3中的pyodbc连接到SQLServer数据库。但是当我尝试建立连接时出现错误。我做了这样的事情:importpyodbcconn=pyodbc.connect('Driver={ODBCDriver18forSQLServer};Server=192.168.2.250;Database=DB;UID=username;PWD=password;')......
  • Oracle知识整合----SQL概述
    目录一、SQL简介二、SQL语言的分类1、数据查询语言(DQL)2、数据操作/操纵(DML)3、数据定义语言(DDL)4、数据控制语言(DCL)5、事物控制语言(TCL)三、数据查询语言1、查询全部2、查询指定列3、在system下查询Scott的dept表,登录的用户的权限要比被查的用户的权限大4......
  • WEB渗透Web突破篇-SQL注入(SQLMAP)
    WEB渗透Web突破篇-SQL注入(数据库判断)-CSDN博客WEB渗透Web突破篇-SQL注入(MYSQL)-CSDN博客WEB渗透Web突破篇-SQL注入(MSSQL)-CSDN博客WEB渗透Web突破篇-SQL注入(Oracle)-CSDN博客WEB渗透Web突破篇-SQL注入(PostgreSQL)-CSDN博客WEB渗透Web突破篇-SQL注入(SQLite)-CSDN博客WEB渗透Web......
  • WeiPHP5.0 sql注入漏洞
    侵权声明本文章中的所有内容(包括但不限于文字、图像和其他媒体)仅供教育和参考目的。如果在本文章中使用了任何受版权保护的材料,我们满怀敬意地承认该内容的版权归原作者所有。如果您是版权持有人,并且认为您的作品被侵犯,请通过以下方式与我们联系:[[email protected]]。我们将在确......
  • pip安装mysqlclient报错
    pip安装mysqlclient报错报错信息Exception:Cannotfindvalidpkg-configname.SpecifyMYSQLCLIENT_CFLAGSandMYSQLCLIENT_LDFLAGSenvvarsmanually这个问题通常是由于缺少mysqlclient的开发包或者相关的环境变量导致的。要解决这个问题,你可以尝试以下几个步骤......
  • 基于 LLM 制作了一个 SQL 方言转换器,未来的某天我可能会用上
    事件起因,公司有从sqlserver转mysql的打算,源码里有不少sqlserver的语句,没有啥批量修改的好方法,人力解决最稳妥,所以基于大模型制作了一个方言转换器项目基于.NET6MVC+Bootstrap简单页面就没有去build前端了,jquery字符串拼接一把梭项目已开源:https://github.com/MayDay-wpf/SQ......
  • 牛客SQL练习小记
    牛客SQL练习总结计算新用户的次日留存率太失败了!!一步一个坎,面对这个问题没有完整的思路,想到一半就无法继续了,只能看大佬们的sql获得启发--思路--这道题关键的两点,一个是标志出新用户,这个可以通过窗口函数min,根据uid分组,计算出首次登录时间--另一个就是二次登陆日期,这个......
  • MySQL入门学习-设计优化.范式设计
        以下是关于MySQL入门学习中设计优化和范式设计的一些基本信息:一、设计优化:1.索引优化:  -选择合适的列创建索引,通常在经常用于查询、连接、排序的列上创建索引。  -避免在过多的列上创建索引,以免影响插入、更新和删除操作的性能。  -对于大型......
  • MySQL入门学习-设计优化.生成列
        在MySQL中,生成列(GeneratedColumn)是一种特殊的列类型,它的值是根据其他列的值或表达式计算得到的。生成列可以分为两种类型:存储生成列(StoredGeneratedColumn)和虚拟生成列(VirtualGeneratedColumn)。一、特点和使用方法:1.存储生成列:  -特点:    ......