---
name: sql-context-builder
description: 当逻辑计划已经完成，需要固定 SQL 生成和 SQL review 共同依赖的 alias、字段来源、join key、指标、维度、过滤、时间窗口、事实表/维表上下文时使用。消费 logic_plan 和 validation_result，不写 SQL，不调用 MCP。
---

# SQL Context Builder（SQL 上下文构建）

## 目标

把 SQL 生成时可能被临时猜测的内容提前固定下来。下游只能使用本 skill 输出的 alias、字段、join、指标、过滤、时间窗口和输出列。

## 输入

```yaml
logic_plan:
  status: PLANNED
validation_result:
  status: VALIDATED
  field_mapping: {}
  joins: []
```

## 工作顺序

1. 给每张表分配唯一、稳定、短小的 alias。
2. 标记事实表、维表、码表和目标表。
3. 把每个业务字段解析成 `alias.column`。
4. 固定 join 谓词、join 类型和基数假设。
5. 固定指标表达式、维度字段、时间字段、分区字段和过滤字段。
6. 固定时间窗口 SQL 片段，尤其是 T-1 完整日边界。
7. 固定输出列顺序和别名。
8. 检查 logic plan 中引用的字段都能在 context 中找到。
9. 对派生字段记录来源步骤和依赖字段。

## 时间窗口上下文

当存在时间过滤时，必须输出 `time_windows`。对“近 N 天按 T-1 完整日”：

```yaml
time_windows:
  - name: t_minus_1_complete_days
    event_field: fl.login_time
    lower_bound_sql: date_sub(current_date(), N)
    upper_bound_sql: current_date()
    predicate_sql: fl.login_time >= date_sub(current_date(), N) AND fl.login_time < current_date()
    boundary: left_closed_right_open
```

下游 SQL 必须复用 `predicate_sql`，不得临时改成 `BETWEEN`。

## 转化指标上下文

转化率必须固定分母、分子和顺序约束：

```yaml
metrics:
  - name: conversion_rate
    numerator: converted_user_cnt
    denominator: new_user_cnt
    order_constraint: pay_time >= register_time
    null_policy: denominator_zero_returns_0
    exists_after_anchor_event: true
```

## 输出格式

```yaml
sql_context:
  status: CONTEXT_READY | NEED_USER_CONFIRMATION
  aliases:
    - alias: fl
      table: user_login
      role: fact | dimension | lookup | target
      source_file: "元数据来源"
  fields:
    - id: fl.user_id
      alias: fl
      table: user_login
      column: user_id
      type: bigint
      role: [join_key, metric]
      nullable: false
      source_file: "元数据来源"
  joins:
    - left: fl.user_id
      right: ur.user_id
      type: left
      cardinality: "N:1"
      source_step: S3
  time_windows: []
  metrics: []
  dimensions: []
  filters: []
  outputs: []
  write_intent:
    mode: query_only | insert_into | insert_overwrite
    target_table: "可为空"
    overwrite_confirmed: false
  unresolved: []
```

## 用户可见摘要

除了 YAML，必须输出：

```markdown
## SQL 上下文
### 表别名
| Alias | 表名 | 角色 |
|---|---|---|

### 字段来源
| 字段 | 来源 | 用途 |
|---|---|---|

### Join 关系
| 左字段 | 右字段 | 类型 | 基数风险 |
|---|---|---|---|

### 指标公式
| 指标 | 分子 | 分母 | 空值策略 |
|---|---|---|---|

### 时间窗口
| 字段 | 下界 | 上界 | 边界 |
|---|---|---|---|
```

## 规则

- alias 一旦生成，下游不能重新命名。
- context 中不存在的字段，下游视为不存在。
- join key 只能来自元数据校验和逻辑计划。
- 指标表达式必须能追溯到 logic plan 的 aggregate 步骤。
- 输出列必须来自 `fields`、`metrics` 或明确派生字段。
- 如果 SQL 生成需要新字段，回到 metadata-validator 或 logic-planner。

## 停止条件

只在 alias、字段、join、指标、时间字段、过滤字段、输出列和写入意图都完整时输出 `CONTEXT_READY`。
