力扣-SQL 601.体育馆的人流量

通过这道题来复习一下row_number()针对连续出现xxx情形的好用用法。

题目

表:Stadium

+---------------+---------+
| Column Name | Type |
+---------------+---------+
| id | int |
| visit_date | date |
| people | int |
+---------------+---------+
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加

编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。

返回按 visit_date 升序排列 的结果表。

查询结果格式如下所示。

示例 1:

输入:
Stadium 表:
+------+------------+-----------+
| id   | visit_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-09 | 188       |
+------+------------+-----------+
输出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解释:
id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。

思考过程

这道题一开始没有想清楚,以为是选出连续三次的行即可,假设有多个,则选出其中的一个,导致我寻找了很久的问题。实际这题非常的简单,讲讲思路。

  1. 这题也是典型的选出连续出现的行,与之前的不同点是,先自行按照条件筛选(people>=100)出满足的行再进行row_number()操作
  2. 举一个例子
idvisit_datepeople
12017-01-0110
22017-01-02109
32017-01-0398
42017-01-0499
52017-01-05145
62017-01-061455
72017-01-07199

使用以下方法对其进行筛选后再排序

select id,visit_date,people,row_number() over (order by id) as sub_index
from Stadium
where people>=100
idvisit_datepeoplesub_index
22017-01-021091
52017-01-051452
62017-01-0614553
72017-01-071994

那么再将id-sub_index ,就可以发现当id是连续的行 id-sub_index得到的值应该是相等的

idvisit_datepeoplesub_index
22017-01-021091
52017-01-051453
62017-01-0614553
72017-01-071993

3. 在这个基础上对sub_index group by 就可以得到相同sub_index的数量,筛选出大于等于3的sub_index即可

题解

with tmp as (
    select id,visit_date,people,id - row_number() over (order by id) as sub_index
    from Stadium
    where people>=100
)
,
op as (
    select sub_index , count(1) as sub_num
    from tmp
    group by sub_index
    having count(1) >=3
)
select id,visit_date,people
from tmp
where sub_index in (select sub_index from op)
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇