姊妹篇《给数仓装一个「长期记忆」》讲的是:Skill / Reference / SQL 各自是什么、怎么分工。
本稿只讲一件事:从空目录到第一套可用知识资产,你要按什么顺序做、怎么验收、覆盖哪些面。
文中示例均为虚构通用名(如 dwd_order、dim_store),不绑定具体公司;可套用到 Hive / Spark / MaxCompute / Snowflake / BigQuery 等。


0. 先说清:这篇和「体系篇」有什么不同

体系篇(长期记忆)本篇(从 0 到 1)
读者状态已决定要建知识库还没动手 / 刚动手
核心问题资产如何分层、写什么第一周先做哪几步
写法说明书 + 模板路径 + 示例 + 验收
你会带走架构共识可复制片段与 checklist

若两篇都读:先跟本篇落地,再回体系篇把文档写厚。


1. 从 0 到 1 的成功标准(先立靶)

不要以「文档写了多少字」为目标。七天后只要同时满足下面四条,就算成功:

  1. 工程不翻车:分区过滤、调度参数、幂等写入成为默认习惯
  2. 口径不瞎猜:至少有一张「场景 → 表 → 时间字段 → 过滤」矩阵
  3. 关联不发散:默认 JOIN 键、禁用/慎用路径写清楚
  4. 有闭环样板:至少一个业务主题的 SQL + README 落在仓库里

AI 负责快,人负责对;从 0 到 1 的产物是「能审的初稿」,不是「零修改终稿」。


2. Day 0:搭骨架(2 小时内完成)

2.1 推荐目录(通用)

dw-ai-knowledge/
├── .cursor/
│   ├── skills/
│   │   └── data-warehouse/
│   │       ├── SKILL.md         # 短:规则、速查、反模式
│   │       └── reference.md     # 长:字典、枚举、模板
│   └── rules/                   # 可选:全局短规则
├── sql/
│   └── order_gmv_daily/         # 示例主题名,按你们业务改
│       ├── README.md
│       └── dws_trd_store_gmv_d.sql
├── tools/
└── docs/

2.2 Skill 触发词示例(description)

---
name: data-warehouse
description: >-
  公司数仓开发规范。适用于写/改离线 SQL、分层建模、调度作业。
  触发词:dwd_ dws_ dm_ dim_ ods_ 分区 ds 业务日期 bizdate
  订单 支付 退款 GMV 门店 会员。
---

触发词太虚(只写「大数据」)→ Agent 经常不加载;写上分层前缀和业务黑话更稳。

2.3 Day 0 验收

随口提:「帮我写一条门店日 GMV 汇总」。若 Agent 开始读 SKILL.md,骨架就算通了。


3. Day 1:工程铁律(让 Agent「不乱写」)

3.1 可直接粘贴的 Skill 片段

## 环境
- 开发库:dw_dev;生产库:dw_prod
- INSERT 目标表不加库前缀;DDL 如需可写两套

## 分区与调度
- 分区字段:ds,格式 yyyyMMdd
- 必须:WHERE ds = '${bizdate}'
- 禁止:WHERE ds = '20240101'

## 写入
- 日作业默认 INSERT OVERWRITE ... PARTITION (ds='${bizdate}')
- INSERT 必须显式列清单,禁止 SELECT *

## 金额与比率
- 明细贴源常见最小货币单位(分);入 DWS/DM 转为元,DECIMAL(18,2)
- 比率 DECIMAL(18,4)

## 反模式
- 分区大表不滤 ds
- 用统计合并键替代默认业务键(未确认时)
- 跨环境项目名写死在 SQL 里

3.2 示例:同一需求,Agent 改前 / 改后

需求:「把昨日订单写入 DWD 分区。」

改前(典型翻车):

INSERT INTO dw_prod.dwd_order
SELECT * FROM ods_order
WHERE create_time >= '2024-01-01';

问题:串环境、无分区覆盖语义、SELECT *、硬编码日期、时间字段可能也不对。

改后(符合铁律):

INSERT OVERWRITE TABLE dwd_order PARTITION (ds = '${bizdate}')
SELECT
    order_id
    ,store_id
    ,user_id
    ,CAST(pay_amount / 100.0 AS DECIMAL(18, 2)) AS pay_amount
    ,pay_time
    ,is_test
FROM ods_order
WHERE ds = '${bizdate}'
  AND order_id IS NOT NULL
;

验收: 再让 Agent 写一条类似加载,看它是否自觉带上 ds、显式列、参数化日期。


4. Day 2:主数据与关联(附 Reference 示例)

4.1 维表条目示例(写「决策信息」,别抄全量 DDL)

## dim_store — 门店维度

- 粒度:1 店 1 行 / 日全量(ds)
- 默认 JOIN:store_id
- 报表对外编码:store_code(勿用内部自增 id 对外)
- 组织:region_id / region_name,company_id / company_name(行上冗余)
- 常用过滤:status = 1 AND is_deleted = false
- 慎用:stat_store_id 仅统计合并场景;默认不要拿它替 store_id

## dim_date — 日期维度

- 无分区;用 ds 或 date_key 关联
- 提供月/周/年起始日字段,供 MTD/YTD 窗口

4.2 发散 JOIN 示例(务必写进「禁止/慎用」)

错误(一对多放大 GMV):

-- dim_store_sku_hist 一个 store 对应多行历史
SELECT s.store_id, SUM(f.gmv) AS gmv
FROM dws_store_gmv_d f
JOIN dim_store_sku_hist s
  ON f.store_id = s.store_id   -- 未限定生效区间 / 未去重
WHERE f.ds = '${bizdate}'
GROUP BY s.store_id
;

正确思路(示例): 先对维表按业务键去重或限定有效期,再关联;或改用当前有效维表。

WITH store_one AS (
    SELECT store_id, store_code, region_id
    FROM dim_store
    WHERE ds = '${bizdate}'
      AND status = 1
    -- 若仍可能重复,加 QUALIFY / ROW_NUMBER 去重
)
SELECT ...
FROM dws_store_gmv_d f
JOIN store_one s ON f.store_id = s.store_id
WHERE f.ds = '${bizdate}'
;

验收: 让 Agent 做「门店 × 销售」,抽查行数是否被维表放大。


5. Day 3:第一个主题闭环(README + SQL 示例)

假设主题:sql/order_gmv_daily/(门店日 GMV)。

5.1 README 示例

# 主题:门店日 GMV

## 粒度
- store_id × ds

## 链路
ods_order_pay → dwd_order → dws_trd_store_gmv_d

## 窗口
- 日快照:事件时间 ∈ [bizdate, bizdate+1)

## 口径(定稿)
- 金额:支付净额(已支付 − 已退),入表单位元
- 剔除:is_test = true
- 时间字段:pay_time(不用 create_time)

## 已知差异
- 与经营看板差异:看板含未支付意向单,本链路不含(待对齐)

5.2 窗口 + 汇总 SQL 示例(示意)

-- dws_trd_store_gmv_d | 门店日 GMV | 上游 dwd_order
WITH date_bound AS (
    SELECT
        TO_DATE('${bizdate}', 'yyyyMMdd') AS start_cal
        ,DATEADD(TO_DATE('${bizdate}', 'yyyyMMdd'), 1, 'dd') AS end_cal
)
INSERT OVERWRITE TABLE dws_trd_store_gmv_d PARTITION (ds = '${bizdate}')
SELECT  /*+ MAPJOIN(db) */
    o.store_id
    ,CAST(SUM(o.pay_amount - o.refund_amount) AS DECIMAL(18, 2)) AS gmv
    ,COUNT(DISTINCT o.order_id) AS order_cnt
FROM dwd_order o
CROSS JOIN date_bound db
WHERE o.ds = '${bizdate}'   -- 或按你们明细分区策略调整
  AND o.pay_time >= db.start_cal
  AND o.pay_time <  db.end_cal
  AND COALESCE(o.is_test, false) = false
GROUP BY o.store_id
;

半开区间 [start, end) 能避免末日边界重复计数,建议在 Skill 里写死这一种。

验收: 只改 ${bizdate},逻辑无需改;同事只看 README 能复述口径。


6. Day 4~5:选用矩阵(带「错误示范」)

6.1 矩阵示例(请替换成你们真实表名)

分析意图用表时间字段默认过滤
订单量 / 订单金额dwd_orderfirst_pay_timeis_test = false
商品 / SKU 销售dwd_order_itemitem_pay_time同上
支付退款净额dwd_pay_refund_flowtrade_time同上;看板口径另议
活动归因订单dwd_mkt_campaign_ordertrade_time按活动有效期

6.2 错误示范:一张表打天下

用户:「看上周销售净额。」
Agent(未教矩阵时)常见写法: 用订单表的 create_time 汇总 pay_amount。

可能错在:

  1. 时间该用流水 trade_time,不是下单时间
  2. 净额该用支付退款事实,不是订单应付
  3. 未剔测试单

教过矩阵之后的提示词可以很短:

按选用矩阵:销售净额 → 支付退款流水 + trade_time + 剔测试。

验收: 分别说「订单量 / 商品件数 / 净额」三个需求,Agent 应换三套表与时间字段。


7. Day 6:口径治理示例(定稿 / 待定 / 禁止)

7.1 Reference 三区示例

## 定稿
- GMV = 已支付金额 − 已退款金额;单位元
- 统计时间:pay_time;窗口半开区间

## 待确认
- 是否包含虚拟门店(is_virtual = true)?当前临时:排除,待业务确认

## 禁止 / 已知坑
- 禁止用 create_time 替代 pay_time 做支付统计
- 禁止未去重的「门店-商品历史维」直接 JOIN 事实(会放大)
- 与财务应收口径不一致:本链路是支付净额,不是开票金额

7.2 枚举表示例(减少幻觉)

## order_status
| 值 | 含义 |
|----|------|
| 1 | 待支付 |
| 2 | 已支付 |
| 3 | 已取消 |
| 4 | 已完成 |

未在表中的状态:不要猜测,先标「待确认」。

规则: 争论结束当天改这三区;只改聊天 = 没沉淀。


8. Day 7:对比验收示例 + 扩展面

8.1 同一需求的 A/B 记录(建议你们也建一张)

需求原文:「统计 ${bizdate} 当日各门店 GMV 与订单数,剔测试。」

检查项无 Skill 初稿有 Skill 初稿
滤分区常无有
时间字段create_timepay_time
金额单位常忘 /100有 CAST 到元
剔测试常漏有
人工修改大段重写对一下样本即可

把「无 Skill 时仍错的点」追加进反模式,文档就产生复利。

8.2 扩展面示例(第一周后)

面小例子
血缘热度下游依赖最多的 20 张表,优先写进 Reference
质量「同一 ds 下 order_id 唯一」「分区行数不为 0」
报表映射表头「门店名称」↔ store_name,「统计月份」↔ SUBSTR(ds,5,2)
回归集固定 5 条需求,每月跑一次看 Skill 是否被改坏

9. 全覆盖检查清单(贴墙上用)

从 0 到 1 至少勾掉加粗项:

工程与规范

  • 环境 / 分层 / 命名 / 分区 / 调度参数
  • 写入幂等与反模式
  • 代码评审清单、发布注意事项

数据语义

  • 核心维表 JOIN 与慎用路径
  • 至少一张跨域选用矩阵
  • 主要枚举值表
  • 金额 / 比率 / 时间口径专章

资产形态

  • Skill(短)+ Reference(长)
  • 至少一个主题 SQL + README
  • 多主题样板
  • 工具脚本与质量规则

协作机制

  • 口径回写约定
  • 定期回归需求集
  • 新人只读路径(先读哪三份文件)

10. 五个坑(配一句反例)

  1. 第一周抄全库 DDL → 写不完;先写「选用矩阵 + 10 张高频表决策信息」
  2. Skill 写成小作文 → Agent 抓不住;改成表格 / 禁止清单
  3. 口径只存在聊天里 → 新会话继续错;必须进 Git
  4. 有 SQL 无 README → 三个月后连自己都忘窗口是否含期末
  5. 和体系篇重复讲概念 → 读者觉得两篇一样;本篇专注步骤与示例

11. 今晚 90 分钟最小闭环(按分钟执行)

  1. 0–20:建目录;粘贴第 3 节 Skill 片段;改环境名
  2. 20–40:写 dim_store / 日期维两条 Reference(照第 4 节)
  3. 40–60:填 3 行选用矩阵(订单 / 明细 / 流水)
  4. 60–80:建 sql/order_gmv_daily/,粘贴 README + SQL 骨架并改成你们表名
  5. 80–90:对 Agent 说需求,对比是否滤 ds、是否用对时间字段;把错点写进反模式

结语

从 0 到 1 的本质,不是让模型变聪明,而是:

把「怎么才算写对数仓 SQL」变成可加载、可 diff、可验收的团队资产。

体系篇回答「房子怎么设计」;
本篇回答「第一周先打哪几根桩」——并给了可抄的桩基示例。

桩打稳了,再往 Reference 里填砖,才不会盖成纸糊的百科全书。


系列建议:① 本篇(落地路径 + 示例)→ ② 体系篇(长期记忆)→ ③ 用血缘/热度反哺高频对象 → ④ 单主题 Agent 协作实录。

相关内容

给数仓装一个「长期记忆」
https://blog.csdn.net/weixin_43932609/article/details/163851120

=========================================================

人生得意须尽欢,莫使金樽空对月!
__一个热爱说唱的程序员。
今日份推荐音乐:王以太 / 艾热AIR《Crazy Love》

=========================================================

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐