入职满月大测
入职满月(第 28 天)。一次 90 分钟闭卷大测,检验前四周的全部家当。
规则
10 题构成 · 120 min
- 3 道窗口函数题(含 1 道连续区间)
参考答案
出题范围对准 D22–D25:每组 TOP N、三种排名在并列时的行为、lag 差值与环比、窗口框架(移动平均 / 累计)。连续区间题必出一道,闭卷重写「distinct 日期 -> 日期序号减行号 -> 按差值分组」三步骨架。
- 2 道递归 / LATERAL 题
参考答案
递归 / LATERAL 出 W3 的题:generate_series 补零日历、递归 CTE 展开层级或连续日期、LATERAL 每组取 N 条。判分标准不只是结果对,还要能讲清「这题为什么不用窗口函数的写法」。
- 5 道多表聚合报表题
参考答案
报表题考「口径先行」:写 SQL 之前先写下分母是谁、NULL 算不算、缺日补不补 0。占比用 sum(x) over (partition by ...),中位数用 percentile_cont,缺日用 generate_series 左连接补零--每一条都对应本周做过的原题。
- 交卷后逐题写错因,更新 mistakes.md
参考答案
错因分三类统计:没懂概念(回当天「学」栏重看并口述一遍)、记不住语法(连续 3 天每天默写一次)、看错题意(读题先圈名词和限定词)。更新 mistakes.md,第 5 周的复盘时段从它开始。
- 重绘一张前四周的知识地图
参考答案
按「一张表 -> 多张表 -> 行变成组 -> 行带上窗口」四层画地图:W1 单表、W2 join、W3 CTE/LATERAL、W4 窗口各挂一层。画不出连接线的地方就是缺口,优先补。
今日复盘
- 查连续登录 7 天及以上的用户(差值分组法)
参考答案
差值分组法(gaps and islands):日期序号减行号,连续段差值恒定、一断档就跳变,按「用户 + 差值」分组即得连续区间。两个细节:日期必须先 distinct(同一天多条会把行号顶歪);PG 里 date 没有减 bigint 的运算符,row_number() 要 ::int。
with d as ( select distinct user_id, login_at::date as d from user_logins -- 先去重! ), g as ( select user_id, d, d - (row_number() over (partition by user_id order by d))::int as grp from d ) select user_id, min(d) as 起始, max(d) as 结束, count(*) as 天数 from g group by user_id, grp having count(*) >= 7 order by 天数 desc, user_id; - 算 7 日移动平均 GMV(
ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)参考答案
between 是闭区间:6 preceding + 当前行 = 7 行,别写成 7 preceding。头 6 天窗口不足 7 行,是「有多少算多少」的均值,要严格 7 天得另加行数校验。
select 日期, gmv, round(avg(gmv) over (order by 日期 rows between 6 preceding and current row), 0) as 七日均值 from (select created_at::date as 日期, sum(total_amount) as gmv from orders group by 1) t order by 日期; - 整理本周的 CTE / 递归 / LATERAL 模板到 notes.md