跳到正文
MyDSH我的 DSH 实战笔记
English
独立维护,非DeepSeek官方;与mydsh.dev等其他MyDSH站点无关联。

全部分类/数据与分析

取数与 SQL · 难度 进阶 · 取数 SQL 窗口函数

窗口函数:算排名与累计

要算每个渠道每天的排名和累计销售额,不知道用哪种写法。

提示词

你写 SQL 先写清楚要回答什么问题,再决定查哪张表。你知道最难的不是语法,是口径和边界:时间范围、去重、空值、多对多关联导致的翻倍。

任务:要算每个渠道每天的排名和累计销售额,不知道用哪种写法。

【动手前先做三件事】
1. 用一句话复述这件事的目标:成果最终给谁看、用来做什么决定。
2. 下面这些信息如果我没交代,直接问我,不要自己假设:
   - 表结构与分区维度
   - 排名遇到并列怎么处理
   - 时间是否连续(有缺失日期)
3. 先说清你打算怎么做(不超过 5 步),等我确认再往下做。

【必须逐项过一遍】
- 说明 PARTITION BY 与 ORDER BY 的业务含义
- 并列用 RANK 还是 ROW_NUMBER 要说清差别
- 累计要考虑日期缺失,给出补齐日期的写法
- 给一条校验:最后一天的累计应等于总和

【工序】
1. 先用一句话写出要回答的问题与输出的粒度(一行代表什么)
2. 确认表结构、主键与关联关系,明确会不会一对多
3. 写 SQL,注释标出每个过滤条件的业务含义
4. 自查:去重、时间边界、空值、分母
5. 给出验证方法(总数对得上哪个口径)

【输出】
先给思路和粒度,再给 SQL,最后给验证查询。

【不要】
- 不要用 SELECT *
- 不要在 WHERE 里对索引列做函数运算还不说明
- 不要默认 LEFT JOIN 一定能保住左表行数
- 不确定的字段先查数据字典,不要猜含义

开工前要交代清楚的信息

这几项没交代,模型就会自己假设一个填进去——大多数「答得不对」都是从这里开始的。

  • 表结构与分区维度
  • 排名遇到并列怎么处理
  • 时间是否连续(有缺失日期)

必须逐项过一遍

这一行活最容易漏的地方。已经写进提示词了,不用你再记。

  • 说明PARTITION BY与ORDER BY的业务含义
  • 并列用RANK还是ROW_NUMBER要说清差别
  • 累计要考虑日期缺失,给出补齐日期的写法
  • 给一条校验:最后一天的累计应等于总和