题目

有一个商场,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (date)、 人流量 (people)。请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。

例如,表 stadium:

对于上面的示例数据,输出为:

这个题的题意已经很明白了,就是要找出 连续三天(含)以上人流量都在100(含)以上的数据。

我用SQL Server 来做吧(因为别人都用MySql,正所谓:常在河边走,哪能都穿鞋?)

我做了点测试数据:

 方法一:

这种题目的思路,就是找到那些数据是即  在100(含)以上,而且又是连续三天对吧?拆分一下思路:
1、每天人流量 >=100

2、连续的天数 要 >=3

你看 我又说了个废话对吧? >=100简单,但是 >=3 这个怎么来呢?也就是怎么求出连续天数呢?

举个例子来总结个规律:

   -     =

   -     =

   -     =

发现了吗,如果一组“减数”和一组“被减数”都是递增的,那么他们的差是相同的哦!有没有猜到我要干嘛了?

先看一下满足第1步需的SQL

select * from stadium where people>= 

Q:这样之后呢?和刚才的规律有毛关系吗?

A:嗯  目前是没有的,但是 如果我给他们增加一列“递增的行号” rownum,和 一例“日期偏移量" dayOffset呢?只要日期连贯,这个dayOffset是否就也是连贯了呢(也就自增了哇)。看图吧

 select *,
row_number() over(order by [date]) as rownum
,datediff(day,'1990-1-1',[date]) dayOffset
from stadium where people>=100

来观察一下,两个红色框的数据 是不是都是符合要求的?怎么取出来呢?

还记得前边总结的【如果一组“减数”和一组“被减数”都是递增的,那么他们的差是相同】的例子吗?这会要用上了

看代码:

 select *,t1.dayOffset-t1.rownum flag from (
select *,
row_number() over(order by [date]) as rownum
,datediff(day,'1990-1-1',[date]) dayOffset
from stadium where people>=100
)t1

看到没有?“日期偏移量" -“递增的行号” 得到的值,如果是连续日期,得到的值相同,如果日期中断,就会得到一个新的值了,这个就不解释了吧

得到了这个值之后,我们是不是可以使用partition来做个分区求数量 最后过滤呢?来吧 就这样了

 select *,count(*) over(partition by t2.flag) conDays from (
select *,t1.dayOffset-t1.rownum flag from (
select *,
row_number() over(order by [date]) as rownum
,datediff(day,'1990-1-1',[date]) dayOffset
from stadium where people>=100
)t1
)t2

透彻了不?最后过滤一下  是不是就可以了?顺便只显示目标数据列就可以了:

select t3.ID,t3.[date],t3.people from (
select *,count(*) over(partition by t2.flag) conDays from (
select *,t1.dayOffset-t1.rownum flag from (
select *,
row_number() over(order by [date]) as rownum
,datediff(day,'1990-1-1',[date]) dayOffset
from stadium where people>=100
)t1
)t2
) t3 where t3.conDays>=3

这种类型的题目还可以继续延伸:

比如:高峰期延续最久的时间段范围?

比如:高峰期持续最长的天数?

类似这种,都可以根据 日期偏移量和行号差的思路来做

方法二:

这个方法就很好理解了,3天对不?我假设每一天都是连续3天的第一天,如果连着三天的数据都是>=100那么这将时我的目标数据

    select t1.id id1,t1.[date] date1,t1.people people1,
t2.id id2,t2.[date] date2,t2.people people2,
t3.id id3,t3.[date] date3,t3.people people3
from (select *,ROW_NUMBER() over(order by id) num from stadium) t1
join (select *,ROW_NUMBER() over(order by id) num from stadium) t2 on t1.num+1=t2.num
join (select *,ROW_NUMBER() over(order by id) num from stadium) t3 on t2.num+1=t3.num
where t1.people>=100 and t2.people>=100 and t3.people>=100

方法很简单,就是联合查询三次这个表,是每条数据都和他后边的两条数据关联。当然,最后两条数据忽略,因为最后两条数据已经出现在 倒数第三条数据中了,看查询效果吧

看看 我们要的数据 是不是都在这里边了?只是他们在同一个行中了,或者有重复数据了 对吧?没关系  我们把他们拿出来 就好了! 看代码

with tb as
(
select t1.id id1,t1.[date] date1,t1.people people1,
t2.id id2,t2.[date] date2,t2.people people2,
t3.id id3,t3.[date] date3,t3.people people3
from (select *,ROW_NUMBER() over(order by id) num from stadium) t1
join (select *,ROW_NUMBER() over(order by id) num from stadium) t2 on t1.num+1=t2.num
join (select *,ROW_NUMBER() over(order by id) num from stadium) t3 on t2.num+1=t3.num
where t1.people>=100 and t2.people>=100 and t3.people>=100
)
select id1,date1,people1 from tb
union
select id2,date2,people2 from tb
union
select id3,date3,people3 from tb

这里with as 和 union我就不介绍了吧。看一下最终效果是不是一样的?

知识很简单,方法多的很。欢迎留言分享其他方法

一个SQL查询连续三天的流量100以上的数据值【SQql Server】的更多相关文章

  1. MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?

    如何用一个SQL查询出一个班级各个学科第N名是谁? 首先贴出建表语句,方便大家本地测试: -- 建表语句 CREATE TABLE score ( id INT NOT NULL auto_incre ...

  2. SQL Server-聚焦深入理解动态SQL查询(三十二)

    前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...

  3. SQL查询连续年份

    有这样一个问题,给出一个表格记录了夺冠球队的名称和年份,我们要做的就是写出一条SQL语句,查询再次期间连续夺冠的有哪些,起止时间是什么 下边是代码 create table #t(TEAM vaarc ...

  4. 一个SQL查询出每门课程的成绩都大于80的学生姓名

    name   kecheng    fenshu 张三     语文     81 张三     数学     75 李四     语文     76 李四     数学     90 王五     ...

  5. 实现用SQL查询连续发文天数/连续登录天数

    当月最长连续发文天数: //临时:id_time_table: select distinct app_id, from_unixtime(create_date_time, 'yyyy-MM-dd' ...

  6. 使用SQL查询连续号码段

    原文http://www.cnblogs.com/tc310/archive/2010/09/17/1829276.html CREATE TABLE #test(fphm INT ,kshm CHA ...

  7. 昨天用到的一个sql查询。可取处,用max

    SELECT T_AssetInfos_ID, MAX(T_AssetConstruct_Name), MAX(T_AssetProperties_Name), SUM(CAST(PropertyVa ...

  8. sql查询结果存入DataTable,然后从DataTable取数据

    public static DataTable SqlConnectionInformation() { string connstr = ConfigurationManager.Connectio ...

  9. SQL查询排序某字段并选前N条数据

    看了网上各种乱七八糟的答案,无语. 明明这一句话就行了. select * from personinfo order by credit DESC limit 0,5

随机推荐

  1. 2020-08-01:MySQL 的数据如何恢复到任意时间点?

    福哥答案2020-08-01: 恢复到任意时间点以定时的做全量备份,以及备份增量的 binlog 日志为前提.恢复到任意时间点首先将全量备份恢复之后,再此基础上回放增加的 binlog 直至指定的时间 ...

  2. C#LeetCode刷题之#844-比较含退格的字符串​​​​​​​(Backspace String Compare)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4030 访问. 给定 S 和 T 两个字符串,当它们分别被输入到空 ...

  3. 【译】gRPC-Web for .NET now available

    .NET 的 gRPC-Web 现在正式发布了.我们在一月份发布了实验版,从那时起,我们就根据早期的用户反馈进行着改进. 有了这个版本,gRPC-Web 就变成了 grpc-dotnet 项目的一个完 ...

  4. K8s集群verification error" while trying to verify candidate authority certificate "kubernetes"

    问题内容 because of "crypto/rsa: verification error" while trying to verify candidate authorit ...

  5. java反序列化——XMLDecoder反序列化漏洞

    本文首发于“合天智汇”公众号 作者:Fortheone 前言 最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDeco ...

  6. JavaScript学习系列博客_2_JavaScript编写位置

    JavaScript代码一般编写在哪里呢? 看到这个问题,第一个反应就是,JavaScript那当然是编写在<Script></Script>这对标签中啊!然而! 1.可以编写 ...

  7. 基于Java的二叉树的三种遍历方式的递归与非递归实现

    二叉树的遍历方式包括前序遍历.中序遍历和后序遍历,其实现方式包括递归实现和非递归实现. 前序遍历:根节点 | 左子树 | 右子树 中序遍历:左子树 | 根节点 | 右子树 后序遍历:左子树 | 右子树 ...

  8. 第1篇 Scrum冲刺博客

    一.Alpha阶段各成员任务 梁天龙 任务名称 预计工时  编辑历史记录  2  登陆按键设计  3  考勤记录页面 2  人数记录页面  2  学习课程页面 4  建议页面  2 黄岳康 任务名称 ...

  9. 区块链入门到实战(38)之Solidity – 条件语句

    Solidity支持条件语句,让程序可以根据条件执行不同的操作.条件语句包括: if if...else if...else if 语法 if (条件表达式) { 被执行语句(如果条件为真) } 示例 ...

  10. 看视频常见的 720p、1080p、4k,这些分辨率到底包含了什么

    从早期的420p,到后来的720p,到现在的非1080p不看.视频的清晰度飞快提升,但是在看到色彩越来越丰富清晰度越来越高的画面时,你有关注过他们的到底是怎么做到的么?我们一起来了解一下吧. 想必大家 ...