zoukankan      html  css  js  c++  java
  • [SQL] 取连续符合条件的值

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

    建表语句及数据:

    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')

    要求:

    编写一个 SQL 查询以找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。
    返回按 visit_date 升序排列的结果表。

    结果如下:

    Stadium table:
    +------+------------+-----------+
    | 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       |
    +------+------------+-----------+
    
    Result table:
    +------+------------+-----------+
    | 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 为 5678 的四行 id 连续,并且每行都有 >= 100 的人数记录。
    请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
    不输出 id 为 23 的行,因为至少需要三条 id 连续的记录。
     

    答案:

    with t1 as(
        select a.*,row_number() over(order by id) as r, id - row_number() over(order by id) as rk
        from tmp_sxy_leetc a 
        where people >= 100
    )
    
    select id,visit_date,people
    from t1
    where rk in(
        select rk
        from t1
        group by rk
        having count(rk) >= 3
    )
    ;

    题目来源:LeetCode - 体育馆人流量

  • 相关阅读:
    线性代数复习向量空间线性相关向量组的秩
    证明:将n(n为2的幂)个点的位反转环划分为长为j(2的幂)的连续片段,这些片段都是次序等价的(分布式算法)
    vim命令小合集
    poj2240floyd算法
    visual studio打开文件所在目录
    5个0,4个1组成的字符串中,出现01或10的次数为4的不同字符串个数
    max spacing kclustering(类似kruskal最小生成树)并查集Debuging
    算法导论16.35huffman树的表示
    最优二叉查找树optimalBSTC++实现2
    算法导论16.37
  • 原文地址:https://www.cnblogs.com/x-you/p/14846455.html
Copyright © 2011-2022 走看看