题目描述
X 市建了一个新的体育馆,每日人流量信息被记录在这三列信息中:序号 (id)、日期 (date)、 人流量 (people)。
请编写一个查询语句,找出高峰期时段,要求连续三天及以上,并且每天人流量均不少于100。
例如,表 stadium:
+------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 1 | 2017-01-01 | 10 | | 2 | 2017-01-02 | 109 | | 3 | 2017-01-03 | 150 | | 4 | 2017-01-04 | 99 | | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+
对于上面的示例数据,输出为:
+------+------------+-----------+ | id | date | people | +------+------------+-----------+ | 5 | 2017-01-05 | 145 | | 6 | 2017-01-06 | 1455 | | 7 | 2017-01-07 | 199 | | 8 | 2017-01-08 | 188 | +------+------------+-----------+
Note:
每天只有一行记录,日期随着 id 的增加而增加。
代码
select
stadium.*
from stadium
inner join
(
select
id-rownum as diff
,group_concat(id) as idlist
,length(group_concat(id))-length(replace(group_concat(id),',','')) #计算逗号的个数,逗号个数为2时表示三个id
from
(
select
@rownum:=@rownum+1 as rownum
,id
from stadium,(select @rownum :=0) t
where people>=100
)t
group by id-rownum
having length(group_concat(id))-length(replace(group_concat(id),',',''))>=2 #表示至少出现三个id
)t
on find_in_set(stadium.id,t.idlist)
本文介绍如何使用SQL查询从体育馆的人流量数据中筛选出连续三天及以上,每天人流量不少于100的高峰期时段。通过内连接和子查询实现,具体包括使用rownum变量计算连续天数,group_concat函数组合ID并计算连续天数。
360

被折叠的 条评论
为什么被折叠?



