-- =====================================================================
-- @Name:             DORIS-D-SQL-{表名}-ETL
-- @Version:          2.0
-- @Desc:             Apache Doris ETL 数据处理模板（临时表链式处理）
-- @TargetDatabase:   Apache Doris
-- @说明:             统一规范：禁止 CTE，每步物化为临时表，先 DROP 再 CREATE
-- =====================================================================

-- ============================================================================
-- Step01: 基础清洗与过滤
-- ============================================================================
-- 说明：从源表读取数据，进行基础过滤和清洗
-- 输入：{源表名}
-- 输出：${db_tmp_env}.tmp_xxx_01

DROP TABLE IF EXISTS ${db_tmp_env}.tmp_xxx_01;
CREATE TABLE ${db_tmp_env}.tmp_xxx_01 AS
SELECT 
    order_id,
    user_id,
    dept_id,
    total_amount,
    status,
    order_date
FROM db_name.source_table
WHERE order_date = '${day_id}'
  AND status IN ('completed', 'shipped')     -- 业务过滤
  AND total_amount > 0                       -- 数据质量过滤
  AND user_id IS NOT NULL;                   -- NULL过滤

-- ============================================================================
-- Step02: 多表关联与维度补全
-- ============================================================================
-- 说明：关联维度表，补全业务属性字段
-- 输入：${db_tmp_env}.tmp_xxx_01, dim_department, dim_category
-- 输出：${db_tmp_env}.tmp_xxx_02

DROP TABLE IF EXISTS ${db_tmp_env}.tmp_xxx_02;
CREATE TABLE ${db_tmp_env}.tmp_xxx_02 AS
SELECT 
    a.order_id,
    a.user_id,
    a.total_amount,
    a.status,
    b.dept_name,                             -- 维度补全：部门名称
    c.category_name,                         -- 维度补全：类别名称
    a.order_date
FROM ${db_tmp_env}.tmp_xxx_01 a
LEFT JOIN db_name.dim_department b 
    ON a.dept_id = b.dept_id
LEFT JOIN db_name.dim_category c 
    ON a.category_id = c.category_id;

-- ============================================================================
-- Step03: 聚合计算与指标生成
-- ============================================================================
-- 说明：按业务维度聚合，计算统计指标
-- 输入：${db_tmp_env}.tmp_xxx_02
-- 输出：${db_tmp_env}.tmp_xxx_03

DROP TABLE IF EXISTS ${db_tmp_env}.tmp_xxx_03;
CREATE TABLE ${db_tmp_env}.tmp_xxx_03 AS
SELECT 
    order_date,
    dept_name,
    category_name,
    COUNT(*) AS record_count,                -- 记录数
    COUNT(DISTINCT user_id) AS unique_users, -- 去重用户数
    SUM(total_amount) AS total_amount,       -- 总金额
    AVG(total_amount) AS avg_amount,         -- 平均金额
    MAX(total_amount) AS max_amount          -- 最大金额
FROM ${db_tmp_env}.tmp_xxx_02
GROUP BY order_date, dept_name, category_name;

-- ============================================================================
-- Step04: 最终输出写入目标表
-- ============================================================================
-- 说明：补全目标表标准字段，写入结果表
-- 输入：${db_tmp_env}.tmp_xxx_03
-- 输出：目标表

INSERT INTO ${db_eda_env}.target_table
SELECT 
    -- 业务字段
    dept_name,
    category_name,
    record_count,
    unique_users,
    total_amount,
    avg_amount,
    max_amount,
    
    -- 技术字段
    NOW() AS etl_time,                       -- 数据加工时间
    '${day_id}' AS stat_date                 -- 统计日期
FROM ${db_tmp_env}.tmp_xxx_03;

-- ============================================================================
-- 关键规则说明
-- ============================================================================
/*
1. 禁止使用 CTE (WITH 子句)
   - 每个步骤必须物化为临时表
   - 原因：便于调试、断点续跑、统一编码规范

2. 先 DROP 再 CREATE
   - 每个临时表创建前必须先 DROP TABLE IF EXISTS
   - 原因：防止表已存在导致失败

3. Doris 写入方式
   - 默认使用 INSERT INTO
   - Aggregate Key 表：自动合并相同 Key 的数据
   - Unique Key 表：自动按主键去重，保留最新数据
   - Doris 2.0+ 也支持 INSERT OVERWRITE

4. 过滤条件前置
   - 所有过滤在最早阶段应用
   - 减少中间数据量

5. 临时表命名规范
   - 格式：tmp_{业务简称}_{步骤序号}
   - 示例：tmp_order_stats_01, tmp_order_stats_02

6. Doris 特有注意事项
   - 不支持 LEFT SEMI JOIN / LEFT ANTI JOIN
   - 日期函数用 MySQL 风格：DATE_FORMAT, DATE_ADD(INTERVAL)
   - 不支持 collect_list/collect_set，用 GROUP_CONCAT 替代
*/
