Leetcode SQL 刷题 601题

该博客介绍了如何使用SQL查询找出体育馆人流量连续三日或以上且每日均大于等于100的记录。通过两种不同的查询思路,即自连接和基本语法查询,详细解析了查询过程,包括找到连续ID并筛选排序,以及利用WHERE子句获取满足条件的记录。内容涵盖了SQL的高级用法和数据处理技巧。
摘要由CSDN通过智能技术生成

Leetcode SQL 刷题


题目描述

体育馆的人流量

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

stadium
Result table


一、分析思路

1.自连接
找到连续三条记录以上的id,并且满足三条记录均大于等于100
首先三个表自连接,第一条查询语句找出三条记录的第一个ID
第二条查询语句找出三条记录的第二个ID
第三条查询语句找出三条记录的第三个ID

   (SELECT s1.Id
    FROM Stadium s1,Stadium s2,Stadium s3
    WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 and s2.people>=100 and s3.people>=100) )
    UNION 
    (SELECT s2.Id
    FROM Stadium s1,Stadium s2,Stadium s3
    WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 and s2.people>=100 and s3.people>=100) )
    UNION
    (SELECT s3.Id
    FROM Stadium s1,Stadium s2,Stadium s3
     WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 AND s2.people>=100 AND s3.people>=100))  
     

根据找到的Id对Stadium进行筛选和排序

SELECT *
FROM Stadium 
WHERE Id IN (
    (SELECT s1.Id
    FROM Stadium s1,Stadium s2,Stadium s3
    WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 and s2.people>=100 and s3.people>=100) )
    UNION 
    (SELECT s2.Id
    FROM Stadium s1,Stadium s2,Stadium s3
    WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 and s2.people>=100 and s3.people>=100) )
    UNION
    (SELECT s3.Id
    FROM Stadium s1,Stadium s2,Stadium s3
     WHERE (s1.Id=s2.Id-1 AND s2.Id=s3.Id-1) AND
    (s1.people>=100 AND s2.people>=100 AND s3.people>=100))
    ORDER BY visit_date ASC

2.使用基本语法查询
在表 stadium 中查询人流量超过 100 的记录,将查询结果与其自身的临时表连接,再使用 WHERE 子句获得满足条件的记录。
第一步:查询人流量超过 100 的记录,然后将结果与其自身的临时表连接。
第二步: 筛选出连续记录大于等于三条的行,
表 t1,t2 和 t3 相同,需要考虑添加哪些条件能够得到想要的结果。以 t1 为例,它有可能是连续三天的第 1 天,第 2 天,或第 3 天。

SELECT DISTINCT S1.*
FROM  Stadium S1, Stadium S2, Stadium S3
WHERE S1.people >= 100 AND S2.people >= AND S3.people >= 100
     AND
    (
        (S1.id - S2.id = 1 AND S1.id - S3.id = 2 AND S2.id - S3.id =1)-- S1, S2, S3
        OR
        (S2.id - S1.id = 1 AND S2.id - S3.id = 2 AND S1.id - S3.id =1)-- S2, S1, S3
        OR
        (S3.id - S2.id = 1 AND S2.id - S1.id =1 AND S3.id - S1.id = 2)-- S3, S2, S1
    )
ORDER BY  S1.id
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值