sql练习生第一次记录

sql练习生第一次记录 601. 体育馆的人流量困难相关标签相关企业SQL SchemaPandas Schema表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 连续的记录。好从这里开始首先我看题目读表信息和要求看完直接分析难点sql能不能计数我的思路people大于100count计数加1小于count等于0我不确定能不能这样做等于没思路练的太少了。直接去看答案吧id - row_number()作为分组标记连续 id 的行差值相同分到同一组 连续统计还真有所有没实现办法直接看答案吧不看答案我根本不知道有这个玩意首选性能最佳的解法核心技巧分组编号法连续序列分组经典解法思路先过滤出people 100的行用id - row_number()作为分组标记连续 id 的行差值相同分到同一组统计每组行数只保留行数≥3 的分组最后输出对应原始数据。WITH filter_data AS ( SELECT *, ROW_NUMBER() OVER(ORDER BY id) rn FROM Stadium WHERE people 100 ), group_data AS ( SELECT *, id - rn grp FROM filter_data )SELECT id, visit_date, peopleFROM group_dataWHERE grp IN (SELECT grp FROM group_data GROUP BY grp HAVING COUNT(*)3) ORDER BY visit_date;递归 CTEMySQL8/PG少量数据、需要递归溯源差大数据禁用面试标准答案推荐数仓 / Spark/Hive 大数据场景优先id - row_number()差值分组日期连续、时间连续场景LAG() SUM累计断点万能方案老旧无窗口函数数据库临时用自连接过渡。id - ROW_NUMBER() OVER(ORDER BY id) AS grp详解id - ROW_NUMBER() OVER(ORDER BY id) AS grp连续分组原理1. 核心结论对于连续递增无断档的数字 idid - 行号的计算结果完全相同 一旦 id 中间出现空缺断裂下一段连续数字会生成一个全新的grp值天然把连续区间划分成独立分组。2. 拿你这道题过滤后的数据演算过滤条件people 100筛选出 6 条数据表格原始 id235678第一步ROW_NUMBER () 按 id 排序生成连续行号 rn开窗函数ROW_NUMBER() OVER(ORDER BY id)无视 id 是否断裂永远从 1 开始生成不间断自增数字表格idrn (行号)213253647586第二步计算 grp id - rn表格idrngrp id - rn分组归属211组 1321组 1532组 2642组 2752组 2862组 2分组结果grp1id2、3连续 2 条不足 3 条过滤掉grp2id5、6、7、8连续 4 条满足≥3 条全部输出3. 为什么连续 id 差值固定数学逻辑假设一段无断裂连续 idx, x1, x2, x3对应行号n, n1, n2, n3第一条x - n第二条(x1) - (n1) x - n第三条(x2) - (n2) x - n所有行差值完全相等分到同一组。一旦中间缺 id比如 3 之后直接跳到 5跳过 4 下一段第一个 id5行号是 35-32和上一组1区分开新分组诞生。4. 优缺点 使用限制优点只一层窗口函数计算量最小Hive/Spark 大数据场景性能最优代码极简一行完成分组标记。限制关键面试考点仅适用于纯数字连续序列id、流水号不能直接用于日期 / 时间连续场景。 比如日期2026-07-01、2026-07-02、2026-07-04日期无法直接做减法必须改用LAG()SUM(断点标记)方案。5. 和 LAG 断点法对比区分数字 id 连续id - ROW_NUMBER()最简最优日期 / 时间连续、不规则序列用LAG() 判断断点 SUM累计求和分组万能通用方案。