{"id":"d6f4a525-58e6-4f87-85f8-c94a1c6a3929","entityType":"agent","slug":"clawhub-maojiebc-majia-huiyuan","name":"会员运营 · 马甲实战版","canonicalUrl":"https://www.xpersona.co/agent/clawhub-maojiebc-majia-huiyuan","canonicalPath":"/agent/clawhub-maojiebc-majia-huiyuan","generatedAt":"2026-10-11T14:17:56.223Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":null},"description":"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。 Skill: 会员运营 · 马甲实战版 Owner: maojiebc Summary: 会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。 Tags: agent-skill:1.4","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s171vv4g1xczzsxtgd1wg0626x83khts:majia-huiyuan","sourceUrl":"https://clawhub.ai/maojiebc/majia-huiyuan","homepage":"https://clawhub.ai/maojiebc/skills/majia-huiyuan","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/maojiebc/majia-huiyuan","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/maojiebc/skills/majia-huiyuan","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":61,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":null},"stars":null,"forks":null,"downloads":1072,"packageName":null,"latestVersion":"1.4.5","tractionLabel":"1.1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T11:48:59.267Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T11:48:59.337Z","lastCrawledAt":"2026-10-11T11:48:59.267Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T11:48:59.267Z","lastVerifiedAt":null,"highlights":[{"version":"1.4.5","createdAt":"2026-09-14T04:22:43.927Z","changelog":"补齐新增口径、券批次、激励费用与储值资金事件，增加实战问题入口；示例为模拟参考，SQL需按自家数据验证。","fileCount":126,"zipByteSize":298946},{"version":"1.4.1","createdAt":"2026-08-09T08:30:53.239Z","changelog":"业务正确性修复：重做三条唯一归因事实桥，统一时间与SCD2口径，修复留存、利润、回本及零订单监控，并新增自动业务验收。","fileCount":236,"zipByteSize":1992409},{"version":"1.4.0","createdAt":"2026-08-07T09:50:30.634Z","changelog":"能力边界深挖：十类活（+业务动作数据依据/CDP标签体系）；公式库第10册《任务与触达回收》（白盒NBA任务池模型、九类任务圈选依据、防打扰仲裁、漏斗回收口径、差评客户挽回）；与 majia-siyu 边界改为同一动作两半协同；RFM 两套口径互指。","fileCount":null,"zipByteSize":null},{"version":"1.3.2","createdAt":"2026-07-28T06:36:11.641Z","changelog":"收紧会员数据触发边界；朋友圈、群发、欢迎语、社群触达与私域经营动作改由 majia-siyu 处理。","fileCount":113,"zipByteSize":248310},{"version":"1.3.1","createdAt":"2026-07-23T01:51:36.397Z","changelog":"v1.3.1 文档装修：新增功能架构图（三大资产/五层数仓/八类活一图看全）+ README.en.md 英文版 + 品牌后缀「· 马甲实战版」落到各展示面 + 版本记录段收敛≤3。数据/公式/方法论内容与 v1.3.0 完全一致，老用户无需重装。","fileCount":313,"zipByteSize":1100509},{"version":"1.3.0","createdAt":"2026-07-23T01:29:26.023Z","changelog":"v1.3.0 Skill 化首发：开源会员运营家底变成顾问型 Agent Skill——咖啡连锁模拟中台样板间（54 数据集/25 ETL/12 看板，DIM/DWD/DWS/ADS/DQC 五层）+ 餐饮 BI 公式库（9 册约 2900 行：复购/RFM/核销/字段词典/NULL 三态坑/39 ETL 索引）+ 获奖直播方法论实录（34 页插画）。八类活：口径咨询/体系设计/缺口诊断/建表 DDL/看板规划/数据质量排障/方法论内训/观远复刻。数据全模拟，MIT。","fileCount":310,"zipByteSize":1093704}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s171vv4g1xczzsxtgd1wg0626x83khts:majia-huiyuan","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T14:17:56.220Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-maojiebc-majia-huiyuan/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":null},"readme":"Skill: 会员运营 · 马甲实战版\n\nOwner: maojiebc\n\nSummary: 会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。\n\nTags: agent-skill:1.4.5, bi:1.4.5, cdp:1.4.5, chinese:1.4.5, crm:1.4.5, data-warehouse:1.4.5, guandata:1.4.5, latest:1.4.5, llm-friendly:1.4.5, membership:1.4.5, repurchase:1.4.5, restaurant:1.4.5, retail:1.4.5, rfm:1.4.5, segmentation:1.4.5\n\nVersion history:\n\nv1.4.5 | 2026-09-14T04:22:43.927Z | user\n\n补齐新增口径、券批次、激励费用与储值资金事件，增加实战问题入口；示例为模拟参考，SQL需按自家数据验证。\n\nv1.4.1 | 2026-08-09T08:30:53.239Z | user\n\n业务正确性修复：重做三条唯一归因事实桥，统一时间与SCD2口径，修复留存、利润、回本及零订单监控，并新增自动业务验收。\n\nv1.4.0 | 2026-08-07T09:50:30.634Z | user\n\n能力边界深挖：十类活（+业务动作数据依据/CDP标签体系）；公式库第10册《任务与触达回收》（白盒NBA任务池模型、九类任务圈选依据、防打扰仲裁、漏斗回收口径、差评客户挽回）；与 majia-siyu 边界改为同一动作两半协同；RFM 两套口径互指。\n\nv1.3.2 | 2026-07-28T06:36:11.641Z | user\n\n收紧会员数据触发边界；朋友圈、群发、欢迎语、社群触达与私域经营动作改由 majia-siyu 处理。\n\nv1.3.1 | 2026-07-23T01:51:36.397Z | user\n\nv1.3.1 文档装修：新增功能架构图（三大资产/五层数仓/八类活一图看全）+ README.en.md 英文版 + 品牌后缀「· 马甲实战版」落到各展示面 + 版本记录段收敛≤3。数据/公式/方法论内容与 v1.3.0 完全一致，老用户无需重装。\n\nv1.3.0 | 2026-07-23T01:29:26.023Z | user\n\nv1.3.0 Skill 化首发：开源会员运营家底变成顾问型 Agent Skill——咖啡连锁模拟中台样板间（54 数据集/25 ETL/12 看板，DIM/DWD/DWS/ADS/DQC 五层）+ 餐饮 BI 公式库（9 册约 2900 行：复购/RFM/核销/字段词典/NULL 三态坑/39 ETL 索引）+ 获奖直播方法论实录（34 页插画）。八类活：口径咨询/体系设计/缺口诊断/建表 DDL/看板规划/数据质量排障/方法论内训/观远复刻。数据全模拟，MIT。\n\nArchive index:\n\nArchive v1.4.5: 126 files, 298946 bytes\n\nFiles: AGENTS.md (6231b), ETL/公共口径/01_触达订单归因桥.sql (1767b), ETL/公共口径/02_券实例核销订单桥.sql (2090b), ETL/公共口径/03_活动参与订单归因桥.sql (1513b), ETL/公共口径/04_v1.4.1_业务验收.sql (9811b), ETL/公共口径/05_门店营业日历.sql (1296b), ETL/公共口径/06_门店月份骨架.sql (1300b), ETL/公共口径/07_SCD2门店时点关联.sql (979b), ETL/公共口径/08_规则任务生成.sql (9066b), ETL/公共口径/README.md (4621b), ETL/逻辑SQL/ads_会员私域驾驶舱.md (5898b), ETL/逻辑SQL/ads_会员经营任务池.md (6296b), ETL/逻辑SQL/ads_门店每日指挥台.md (15140b), ETL/逻辑SQL/ads_高层经营驾驶舱.md (5054b), ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md (14537b), ETL/逻辑SQL/etl_ads_单店利润健康 (6节点·J+C+S).md (10465b), ETL/逻辑SQL/etl_ads_异常归因清单.md (20762b), ETL/逻辑SQL/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).md (11844b), ETL/逻辑SQL/etl_dqc_归因清单对账.md (12589b), ETL/逻辑SQL/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).md (7908b), ETL/逻辑SQL/etl_dws_会员同期群留存.md (8424b), ETL/逻辑SQL/etl_dws_会员生命周期.md (12720b), ETL/逻辑SQL/etl_dws_体验口碑汇总.md (9035b), ETL/逻辑SQL/etl_dws_券效益分析.md (6143b), ETL/逻辑SQL/etl_dws_加盟商经营汇总 (7节点·S+J+C).md (7999b), ETL/逻辑SQL/etl_dws_加盟回本测算 (9节点·S×3+J+C).md (12880b), ETL/逻辑SQL/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).md (17575b), ETL/逻辑SQL/etl_dws_员工导购效能 (8节点·F+S+J+C).md (8509b), ETL/逻辑SQL/etl_dws_商品销售分析.md (6503b), ETL/逻辑SQL/etl_dws_成本结构汇总 (7节点·J+S+C).md (6007b), ETL/逻辑SQL/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).md (7162b), ETL/逻辑SQL/etl_dws_渠道迁移分析.md (7251b), ETL/逻辑SQL/etl_dws_目标达成.md (5531b), ETL/逻辑SQL/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).md (6174b), ETL/逻辑SQL/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).md (9798b), GENERATED.md (435b), LICENSE.md (1097b), llms.txt (3129b), README.en.md (6987b), README.md (21903b), skill-card.md (2956b), SKILL.md (10957b), 公式库/01-date-and-time.md (7423b), 公式库/02-customer-and-membership.md (29842b), 公式库/03-revenue-kpi.md (7296b), 公式库/04-channel-and-store.md (17694b), 公式库/05-coupon-and-discount.md (7663b), 公式库/06-sql-utils.md (10598b), 公式库/07-data-quality-traps.md (8942b), 公式库/08-etl-engineering-patterns.md (14943b), 公式库/09-etl-catalog.md (14188b), 公式库/10-task-and-touch-recovery.md (15496b), 公式库/README.md (6316b), 公式库/实战问题入口.md (9080b), 分享/区域运营的一天/README.md (15811b), 数据集/结构定义/ads_会员私域驾驶舱.md (3472b), 数据集/结构定义/ads_会员经营任务池.md (7236b), 数据集/结构定义/ads_加盟商单店报告.md (11108b), 数据集/结构定义/ads_单店利润健康.md (8552b), 数据集/结构定义/ads_异常归因清单.md (4303b), 数据集/结构定义/ads_活动权益复盘.md (4628b), 数据集/结构定义/ads_门店每日指挥台.md (5947b), 数据集/结构定义/ads_高层经营驾驶舱.md (2595b), 数据集/结构定义/dim_会员主档.md (3853b), 数据集/结构定义/dim_会员身份桥.md (3664b), 数据集/结构定义/dim_券模板.md (2804b), 数据集/结构定义/dim_加盟商主档.md (3331b), 数据集/结构定义/dim_员工导购.md (2733b), 数据集/结构定义/dim_商品主档.md (3339b), 数据集/结构定义/dim_成本科目.md (2447b), 数据集/结构定义/dim_日期.md (3309b), 数据集/结构定义/dim_活动主档.md (3083b), 数据集/结构定义/dim_门店主档.md (7075b), 数据集/结构定义/dqc_归因清单对账.md (2526b), 数据集/结构定义/dwd_会员注册绑定.md (2539b), 数据集/结构定义/dwd_会员经营任务.md (5104b), 数据集/结构定义/dwd_会员触达.md (3669b), 数据集/结构定义/dwd_券事件.md (3359b), 数据集/结构定义/dwd_加盟分账明细.md (3678b), 数据集/结构定义/dwd_加盟合同明细.md (4649b)\n\nFile v1.4.5:SKILL.md\n\n---\nname: majia-huiyuan\ndescription: \"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。\"\nlicense: MIT\nmetadata:\n  version: \"1.4.5\"\n  author: \"超级马甲 / maojiebc\"\n  homepage: https://github.com/maojiebc/majia-huiyuan\n  openclaw:\n    emoji: \"🪪\"\n    homepage: https://github.com/maojiebc/majia-huiyuan\n---\n\n# 会员运营 · 马甲实战版\n\n你装上的是一套**开源会员运营家底**：一个可审计、可改造的连锁会员数据中台样板间 + 一座口径公式库 + 一份方法论实录。你的角色是**会员数据顾问**——用户大概率是业务或数据分析背景，不是工程师：先人话，后术语；每个结论给出处路径。SQL 是待验证参考实现，不能承诺“换表名即可生产”。\n\n## 功能架构\n\n一图看全：三大资产 → 五层数仓 → 会员数据顾问能干的十类活。\n\n![majia-huiyuan 功能架构](https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png)\n\n## 三大资产\n\n> SkillHub 为文本精简包：保留结构定义、ETL 逻辑、看板文档、公式库与方法论正文；数据样本、原始 JSON 和图片请从 GitHub 完整版读取。\n\n| 资产 | 位置 | 是什么 |\n|---|---|---|\n| **样板间** | `数据集/` `ETL/` `看板/` `清单/` | 咖啡连锁模拟中台：55 个逻辑数据集（DIM10/DWD16/DWS16/ADS8/DQC1/param4）、25 条 ETL、12 张角色看板。校正逻辑以 `ETL/逻辑SQL/` + `ETL/公共口径/` + `看板/页面文档/` 为准；原始 JSON 与页面 JSON 仅是 v1.4.0 workshop 历史快照 |\n| **公式库** | `公式库/` | 10 册约 3100 行，蒸馏自真实履职（已脱敏）：复购 / RFM（按最近来没来、来得勤不勤、花得多不多分层）/ 核销 / 留存流失的标准 SQL、通用字段词典、数据质量三态坑、DWD 宽表范式、39 生产 ETL 索引、任务与触达回收模型。总入口 `公式库/README.md`（路由表 + 5 条最易踩的坑） |\n| **方法论实录** | `分享/区域运营的一天/README.md` | 获奖直播书面实录（34 页插画）：区域运营痛点 → AI 跑五步人拍板 → 可信四件套 → 三案例（归因到人 / 会闭嘴 / 会多看一眼）→ 四类人落地 FAQ |\n\n## 任务路由（用户要 X → 你做 Y）\n\n常见问题可先读 [实战问题入口](公式库/实战问题入口.md)：复购对账、门店读数、注册归因、员工激励、券核销、开业回收、召回与储值事件。它说明最少要什么数据、什么结果才算答到了问题。\n\n| 用户要什么 | 你怎么干 |\n|---|---|\n| **问口径 / 公式**（\"复购怎么算\"\"RFM 怎么分层\"\"核销率口径\"） | 先查 `公式库/README.md` 路由表进对应分册拿标准 SQL；再对照 `ETL/逻辑SQL/` 里样板间的实际实现，两处一致时置信度最高。**必须提口径选项**（如复购跨天 vs 非跨天是两条曲线）。注意 RFM 有两套并存口径：公式库 02 册是高低二分 8 类（快速起步），样板间 ETL 是 5 分制 9 类（精细运营）——先问用户场景再选，不要混用 |\n| **业务动作要数据依据**（\"做一次流失召回\"\"新客怎么促二单\"\"外卖客怎么拉到店\"\"任务怎么派给导购\"） | 按\"圈谁 → 何时 → 力度 → 派给谁 → 怎么回收\"五件套作答：圈选条件出自 `dws_会员生命周期`（7 阶段状态机）/ `dws_会员RFM分层` / `dws_渠道迁移分析`（近 30 天 vs 前 60 天堂食外卖迁移）；时机与力度阈值出自 `公式库/02` 的 R 阈值分级决策表（14/21/30/60 天四档对应不同券力度）+ `param_` 参数表；分派与回收模型出自 `公式库/10-task-and-touch-recovery.md`（任务池 NBA 模型）。**执行内容（话术/素材/社群 SOP）切 majia-siyu，明确告知用户** |\n| **搭 CDP / 标签体系 / 身份打通** | OneID 样板 = `dim_会员身份桥`（手机号 Hash / OpenID / UnionID / 企微外部联系人 / 支付渠道五类身份 + 匹配置信度 + 匹配方式）；身份合并优先级 SQL 在 `公式库/02` 开篇\"顾客标识统一化\"；标签规则外置范式 = `param_` 参数表模式（阈值不硬编码进 SQL）；Profile+Events 双层 = `dim_会员主档` + 六张 `dwd_` 事件表 |\n| **从零设计会员数据体系** | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 分阶段给**最小可用集**：先档案（会员主档/门店主档）+ 订单流水，再算汇总（RFM/生命周期），再上报表。绝不一次吐 55 张表 |\n| **诊断现有体系缺什么** | 把 55 个逻辑数据集当 checklist，逐层对照用户已有的表，输出缺口清单 + 补齐优先级（优先补影响口径的 DIM 和 param） |\n| **生成建表语句** | 用 `数据集/结构定义/*.md` 的字段与类型信息推 schema；需要取值样本时读取 GitHub 完整版的 `数据集/数据样本/*.csv`，翻译成用户的目标引擎方言（源是 Spark 3.4，MySQL/ClickHouse/PG 注意函数差异并主动提醒） |\n| **规划看板体系** | 参照 12 张角色看板（`看板/页面文档/`）：老板看驾驶舱、会员负责人看私域盘、店长看每日指挥台、加盟商看单店报告——按用户组织架构裁剪，每个角色一张 |\n| **数据质量排障**（\"两套数对不上\"\"AI 老搞混字段\"） | 查 `公式库/07-data-quality-traps.md`；对账参照 `dqc_归因清单对账` 原 9 项合流检查 + `ETL/公共口径/04_v1.4.1_业务验收.sql` 现 19 项业务不变量 |\n| **讲解方法论 / 做内训素材** | 用 `分享/区域运营的一天/README.md` 的叙事：五步动作链、可信四件套（param 参数表/归因清单唯一出口/dqc 对账/P0 护栏）、\"误报比漏报贵\"\"让 AI 学会闭嘴\"。引用案例时注明数据为模拟 |\n| **复刻整套到观远 BI** | `*/原始JSON/` 与 `看板/页面JSON/` 只能帮助理解 v1.4.0 原 workshop DAG / 布局，不能当 v1.4.1 修复后的导入包；先把 `ETL/逻辑SQL/`、`ETL/公共口径/` 与 `看板/页面文档/` 的当前字段落到目标平台。平台操作细节切到 **majia-guanyuan** |\n\n## 两张最稀缺的牌（用户没点名也要主动亮）\n\n1. **任务池 = 白盒 NBA（Next Best Action）模型**。`dwd_会员经营任务`（21 列）+ `ads_会员经营任务池`（32 列）完整覆盖 MA/SCRM（帮你管顾客、发消息的营销系统）的核心四段：输入（人群标签 / 任务来源：规则生成·模型生成·人工指派 / 优先级 P0-P2）→ 决策（**推荐动作 / 推荐权益 / 推荐原因 / 预计价值**）→ 执行（导购分派 / 截止与失效时间 / 触达方式）→ 回收（触达后下单金额 / 转化阶段）。市面 MA 产品卖的就是这套东西的软件化，这里是\"用 BI+ETL 就能搭\"的白盒版，九类任务类型与优先级映射见 `公式库/10-task-and-touch-recovery.md`。\n2. **param_ 参数表带\"阈值定标方法论\"**。v1.4.1 已拆成真正控制活跃/沉睡/流失天数的 `param_会员生命周期阈值`，以及按店型控制占比滑坡预警的 `param_门店会员占比预警阈值`。**阈值不是拍脑袋，是从分布拐点定标再经业务复核**——用户已有 SCRM（帮你管顾客、发消息的营销系统）时，缺的往往不是系统而是这个。\n\n## 硬约束（违反会误导用户）\n\n1. **数据是模拟的**：结构、字段、口径、设计思路随便引用；**数值绝不可**当真实经营数据或行业基准。\n2. **口径先行**：凡涉及复购/留存/频次类指标，先确认口径再给公式——口径不统一时，算得越快错得越快。\n3. **SQL 是 Spark 3.4 方言**：跨引擎主动提醒函数差异。\n4. **引用带路径**：给用户的每个结论标注来源文件相对路径。\n5. **ID 不可移植**：原始 JSON 里的资源 ID 是 workshop 实例私有的。\n6. **时间与归因不可混用**：同批次只用一个 `as_of_date`；没有对照组时只能称“关联/归因 GMV”，不能称“贡献销售/增量 ROI”。\n7. **原始 / 页面 JSON 不是当前权威实现**：它们保留历史 workshop 快照；当前口径以逻辑 SQL、公共事实桥、页面文档和自动验收为准。\n\n更多命名约定与文件形态说明见 [AGENTS.md](AGENTS.md)；机器可读索引见 [llms.txt](llms.txt)。\n\n> 📦 **完整版以 GitHub 为准**：若发布包缺图片、样本或历史 JSON，`git clone https://github.com/maojiebc/majia-huiyuan` 取完整版；历史 JSON 只用于审计原 DAG，不代表 v1.4.1 校正逻辑。\n\n## 与兄弟 skill 的分工\n\n- **majia-huiyuan（本 skill）**：会员运营的数据与公式——体系怎么设计、口径怎么算、看板给谁看，以及**每个运营动作的数据依据**（圈谁 / 何时 / 力度 / 派给谁 / 怎么回收）。**平台无关。**\n- **[majia-siyu](https://github.com/maojiebc/majia-siyu-team)**：私域经营动作的**执行内容**——朋友圈、群发、欢迎语、社群触达、企微操作和整盘经营诊断。同一个动作两半分工：数据依据在本 skill，话术素材在 siyu；用户从任一侧进来，都告知另一半在哪。\n- **[majia-guanyuan](https://github.com/maojiebc/majia-guanyuan)**：观远 BI 平台的工具与踩坑——ETL 治理、报错手册、自定义图表注入、发布状态机。用户在观远平台上动手时切过去。\n\n**界外不接**（说明白再送走）：付费广告投放的回流模型与 ROI 归因（曝光/点击/消耗不在库内，本库只管投放前的人群圈选）；秒级实时触发（本库是 T+1 批处理快照，实时 MA 是系统的活）；触达通道的 API 对接执行。\n\n## 📋 版本记录\n\n- **v1.4.5**（2026-09-14）补齐有效新增、奖励结算、券批次与观察期、开业回收和储值事件；明确模拟示例与经营效果边界。\n- **v1.4.4**（2026-09-07）实战问题入口、包内链接与 WorkBuddy ZIP 检查。\n- **v1.4.3**（2026-09-03）WorkBuddy 单专家适配与平台契约检查。\n\n完整历史见 [CHANGELOG](https://github.com/maojiebc/majia-huiyuan/blob/main/CHANGELOG.md)。\n\nFile v1.4.5:ETL/公共口径/README.md\n\n# v1.4.2 公共口径\n\n这里放 25 条示范 ETL 共用的三条事实桥，以及第二刀抽出的时间规范。为让单条逻辑文档可独立阅读，当前核心 ETL 仍内嵌了等价实现，并由自动测试约束窗口、有效性、唯一性和 SCD2 去重保持一致；生产落地时应先物化公共口径，再让下游直接引用。\n\n## 事实桥\n\n| 事实桥 | 输入 | 唯一性 | 用途 |\n|---|---|---|---|\n| `01_触达订单归因桥.sql` | 会员触达 + 已完成订单 | 每个订单最多命中一次最近有效触达 | 私域漏斗、高层驾驶舱、触达后关联销售 |\n| `02_券实例核销订单桥.sql` | 券实例事件 + 已完成订单 | 每个订单最多命中一个实际核销券实例 | 核销订单 GMV、优惠成本 |\n| `03_活动参与订单归因桥.sql` | 活动参与 + 已完成订单 | 每个订单最多命中一次最近有效活动参与 | 活动参与后归因 GMV |\n\n共同约束：\n\n1. 所有输入事实日期不得晚于同一个 `as_of_date`。\n2. 归因只能发生在事件之后；默认滚动窗口为事件时间（含）至事件时间加 8×24 小时（不含），标记为 0–7 天，可由调度参数替换。\n3. 使用 `ROW_NUMBER() OVER (PARTITION BY 订单ID ...) = 1` 强制订单级唯一性。**三种口径各自独立**：同一订单可以同时出现在触达桥、券桥和活动桥，但不能在同一条桥里出现两次。\n4. 下游一律按订单发生日期汇总，不能把未来七天订单塞回触达日或参与日。\n5. 这些桥只证明“时间窗口内关联”，不证明增量。没有随机对照或合格准实验时，只能叫“关联 GMV / 归因 GMV”，不能叫“贡献销售 / 增量 ROI”。\n6. 券实例只有在核销日期落在发放日至失效日内、且不晚于 `as_of_date` 时才是有效核销；异常多券同单时按优惠金额降序、券 ID 升序只保留一张券承接订单 GMV。\n7. `04_v1.4.1_业务验收.sql` 必须同时检查三条桥的订单唯一性和“归因 GMV ≤ 同期已完成订单 GMV”。只验收触达桥不算第一刀完成。\n\n## 时间规范\n\n| 规范 | 粒度 | 约束 |\n|---|---|---|\n| `05_门店营业日历.sql` | 一门店 × 一个自然营业日 | 开业日至 `min(闭店日, as_of)` 每天一行，当天 0 单也保留。开闭店边界只取当前版本。 |\n| `06_门店月份骨架.sql` | 一门店 × 一个营业月份 | 开业月至 `min(闭店月, as_of 月)` 每月一行，零销售但有成本的月份必须留下。月份属性按 `维度命中日期` 走 SCD2。 |\n| `07_SCD2门店时点关联.sql` | 一条事实 × 一个门店版本 | 每个 `(门店ID, 事实日期)` 最多一个版本；重叠窗口按生效起始日、版本 ID 降序只留一行，`scd_rn = 1`。关联前后事实行数守恒。 |\n\n时间规范额外约束：\n\n1. 开闭店边界可以用当前版本；**日/月属性禁止用当前版本回写历史**，必须按事实日期做 SCD2。\n2. 指挥台、门店日报、利润月汇总、新店爬坡、体验口碑都必须在关联后门店键不重复。\n3. 同期群未走完整观察期的 `Mn`（不含 M0）必须输出空的留存人数和留存率。\n4. `04_v1.4.1_业务验收.sql` 第 23–27 项检查门店日/门店月/新店爬坡/体验口碑唯一性，以及未完整观察月的空值。\n\n## 规则任务生成\n\n| 规范 | 粒度 | 约束 |\n|---|---|---|\n| `08_规则任务生成.sql` | 一个会员 × 一条规则任务 | 九类圈选先 UNION ALL；营销任务挡近 7 日触达，负评修复豁免；再按 P0<P1<P2、预计价值降序只留一条。 |\n\n任务生成额外约束：\n\n1. 这是候选任务，不是 `dwd_会员经营任务` 的执行快照。`ads_会员经营任务池` 仍展示已分派任务。\n2. `推荐原因` 必须在生成时写成带数字的人话；`预计价值` 冷启动用历史客单价，不是增量。\n3. 防打扰查 `dwd_会员触达`，不查任务表。负评修复不参加防打扰，但参加仲裁。\n4. 营销任务按会员 ID 数字尾号做 10% holdout（尾号 0）；负评修复不进对照。触达后下单不能叫增量。\n5. `04_v1.4.1_业务验收.sql` 第 28 项检查规则任务会员唯一。\n6. 漏斗、高层驾驶舱、券效益、活动复盘的归因 CTE 必须使用与本目录相同的桥名：`bridge_触达订单归因` / `bridge_券核销订单` / `bridge_活动参与订单归因`。生产应先物化这三张桥，再让下游直接引用。\n\nSQL 为 Spark 3.4 方言。文件中的 `DATE '2026-06-24'` 是本模拟快照的默认值，生产调度必须替换为同一批次的运行参数。\n\nFile v1.4.5:README.md\n\n# majia-huiyuan · 会员运营家底（开源样板间）\n\n[![Skill Version](https://img.shields.io/badge/skill-v1.4.5-blue)](./SKILL.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n[![skills.sh](https://skills.sh/b/maojiebc/majia-huiyuan)](https://skills.sh/maojiebc/majia-huiyuan)\n[![Release](https://img.shields.io/github/v/release/maojiebc/majia-huiyuan?label=release&color=success)](https://github.com/maojiebc/majia-huiyuan/releases)\n[![Quality](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml/badge.svg)](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml)\n[![AI Agent Friendly](https://img.shields.io/badge/AI_Agent-friendly-1abc9c)](./AGENTS.md)\n[![Data](https://img.shields.io/badge/%E6%95%B0%E6%8D%AE-%E5%85%A8%E6%A8%A1%E6%8B%9F%E7%94%9F%E6%88%90-orange)](#数据说明必读)\n\n> **会员运营 · 马甲实战版** — 一套**完整、可审计、可改造的**连锁会员数据参考体系。以一家虚构的咖啡连锁为例，从会员注册的第一行数据，到老板看的经营驾驶舱：**55 个逻辑数据集、25 条数据加工链、12 张看板，外加约 3100 行的实战公式库**，全部摊开。\n>\n> 数据全部模拟生成，与任何真实企业无关。MIT 协议，个人用、公司用、商用，都随便。\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png\" width=\"440\" alt=\"majia-huiyuan v1.4.1 功能架构：三大资产 + 五层数仓 + 会员数据顾问十类活 + 与 majia-siyu（执行内容）及 majia-guanyuan（平台工具）的分工\"/>\n</p>\n\n**谁适合看**：做会员、做私域的业务同学；做数据分析、数据建设的同学；想给自己公司从零搭一套会员数据体系的人。**不需要会写代码。**\n\n**AI 也适合看**：如果你是 AI Agent（WorkBuddy / Claude / Codex / Cursor …），你的入口在 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md)；本仓库同时是一个可安装的 **Agent Skill**（[SKILL.md](./SKILL.md)），装法见[下方](#-当-agent-skill-用)。\n\n---\n\n**你是谁，直接去哪里：**\n\n| 我想做的事 | 直接去 |\n|---|---|\n| 店长先看什么、新增怎么算、奖励怎么结 | [实战问题入口](公式库/实战问题入口.md) |\n| 找某个指标怎么算（复购率、RFM、核销率…） | [公式库/README.md](./公式库/README.md) → 按主题找分册 |\n| 看表结构 / 字段定义 / 数据长什么样 | [数据集/结构定义/](./数据集/结构定义/) + [数据集/数据样本/](./数据集/数据样本/) |\n| 理解某条 ETL 的加工逻辑和 SQL 口径 | [ETL/逻辑SQL/](./ETL/逻辑SQL/) 按表名找对应 md |\n| 搭观远 BI，理解原 workshop DAG / 布局 | [ETL/原始JSON/](./ETL/原始JSON/) + [数据集/原始JSON/](./数据集/原始JSON/) + [看板/页面JSON/](./看板/页面JSON/)（均为历史快照，不含 v1.4.1 字段修复；资源 ID 也不可移植） |\n| 用 AI 工具直接问会员数据问题 | [SKILL.md](./SKILL.md) 装成 Agent Skill，或把仓库地址扔给 AI |\n| 发布到 WorkBuddy 开放平台 | [workbuddy/README.md](./workbuddy/README.md) → 生成自包含单专家 ZIP，并先跑平台契约测试 |\n| 先看故事再翻表 | [分享/区域运营的一天/](./分享/区域运营的一天/README.md) |\n\n> **v1.4.5 可信边界：**`ETL/逻辑SQL/`、[`ETL/公共口径/`](./ETL/公共口径/) 与 `看板/页面文档/` 是当前校正后的参考口径；本次补充门店经营口径与实战问题入口，数仓参考逻辑沿用 v1.4.2，仍需用自家数据验证后再生产化。`*/原始JSON/` 和 `看板/页面JSON/` 是 2026-06-24 的 workshop 历史快照，保留用于审计原 DAG / 布局，**未同步改造成可直接导入包**，其中仍可能出现旧字段名。当前 SQL 定位是“待验证示例”，不是标准答案。未做 Spark 全量回放。\n\n---\n\n## 这是什么\n\n会员运营这行有块三不管地带：字段怎么定义、口径怎么算、看板怎么搭，做业务的嫌它是技术细节，做数据的嫌它是业务琐事，两边都懂的人当它是吃饭本事。结果就是，想学的人找不到一份能从头看到尾的完整参照。\n\n这个仓库就是那份参照——一个\"样板间\"。\n\n它是 2026 年 5 月在观远 BI 官方 workshop 实例上独立搭建的一套完整会员数据中台，虚构了一家咖啡连锁：**8 万会员、1200 家门店、141 个加盟商、74 个商品、129 万笔订单**。麻雀不大，五脏俱全：会员注册、订单、发券、积分、私域触达、投诉评价、加盟分账、门店成本，全链路的数据都有，而且是打通的。\n\n毛坯房教不会人装修，样板间可以。你不一定照单全收，但每面墙长什么样、水电怎么走，这里都看得见。\n\n本仓库会持续迭代，路线图见[下方](#路线图)。\n\n## 三分钟看懂：数据分五层\n\n所有数据集按五层组织（这是数据行业的通用做法，名字唬人，事情简单）：\n\n| 层 | 行话 | 人话 | 本库数量 |\n|---|---|---|---|\n| **DIM** | 维度层 | **档案柜**：会员档案、门店档案、商品档案，一行 = 一个人 / 一家店 / 一件商品 | 10 |\n| **DWD** | 明细层 | **流水账**：每笔订单、每次发券、每条评价，一行 = 发生过的一件事 | 16 |\n| **DWS** | 汇总层 | **台账**：把流水按人、按店、按月归拢，复购率、RFM 分层都在这层算出来 | 16 |\n| **ADS** | 应用层 | **驾驶舱**：老板、店长、运营直接看的最终报表 | 8 |\n| **DQC** | 质检层 | **质检员**：两套数对不上时，先来这层查 | 1 |\n| param | 参数表 | 阈值配置（比如\"几天没来算流失\"，写在表里而不是写死在公式里） | 4 |\n\n数据的流向一句话：**档案柜 + 流水账 →（25 条加工链）→ 台账 → 驾驶舱**。\n\n## 资产地图（55 个逻辑数据集）\n\n每个数据集一句人话。字段级明细看 [数据集/结构定义/](./数据集/结构定义/)，长什么样看 [数据集/数据样本/](./数据集/数据样本/)。\n\n### DIM 档案柜（10）\n\n| 数据集 | 一句话 |\n|---|---|\n| dim_会员主档 | 每个会员一行：等级、注册渠道、城市、状态（8 万行） |\n| dim_会员身份桥 | 一个人的多个身份（手机号 / 微信 / 支付宝）怎么认成同一个人 |\n| dim_门店主档 | 每家店一行：城市、店型、开业日期（1200 家） |\n| dim_加盟商主档 | 每个加盟商一行（141 个） |\n| dim_商品主档 | 每个商品一行：品类、价格带（74 个） |\n| dim_券模板 | 每种券一行：面额、门槛、有效期 |\n| dim_活动主档 | 每场营销活动一行 |\n| dim_员工导购 | 每个店员 / 导购一行 |\n| dim_成本科目 | 房租、人力、原料……成本怎么分类 |\n| dim_日期 | 日期维表：节假日、周末、月份归属 |\n\n### DWD 流水账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dwd_订单 | 每笔订单一行：金额、渠道、是否会员、是否用券（129 万行） |\n| dwd_订单商品 | 订单里的每件商品一行 |\n| dwd_会员注册绑定 | 每次注册 / 绑定一行 |\n| dwd_券事件 | 每张券的发放、核销、过期 |\n| dwd_积分事件 | 每笔积分的挣与花 |\n| dwd_会员触达 | 每次触达一行：短信 / 企微 / Push，发给谁、谁打开（50 万行） |\n| dwd_私域事件 | 进群、退群、加好友、会话 |\n| dwd_活动参与 | 谁参加了哪场活动 |\n| dwd_评价 | 每条顾客评价 |\n| dwd_投诉 | 每条投诉 |\n| dwd_会员经营任务 | 总部派给门店的会员任务及完成情况 |\n| dwd_加盟合同明细 | 每份加盟合同 |\n| dwd_加盟分账明细 | 每笔加盟分账 |\n| dwd_门店成本明细 | 每笔门店成本 |\n| dwd_门店投资明细 | 每笔开店投资 |\n| dwd_门店目标 | 每店每期的目标值 |\n\n### DWS 台账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dws_会员RFM分层 | 每个会员的 R / F / M 打分和分层标签（做精准营销的底座） |\n| dws_会员生命周期 | 新客 / 活跃 / 沉睡 / 流失，每人当前在哪一段 |\n| dws_会员同期群留存 | 按注册月份分组，看每批人第 N 月还剩多少（Cohort 留存） |\n| dws_私域转化漏斗 | 触达 → 查看 → 下单，每场活动的漏斗和转化率 |\n| dws_券效益分析 | 每种券核销了多少、对应订单 GMV 多少；无对照时不报增量 ROI |\n| dws_渠道迁移分析 | 顾客在堂食 / 外卖 / 小程序之间怎么流动 |\n| dws_商品销售分析 | 每个商品卖得怎么样 |\n| dws_门店日报 | 每店每天的核心经营数 |\n| dws_目标达成 | 每店目标完成进度 |\n| dws_新店爬坡_Comp老店 | 新店爬坡曲线，和可比老店（Comp）对照 |\n| dws_单店利润月汇总 | 每店每月的利润账 |\n| dws_成本结构汇总 | 成本按科目的构成 |\n| dws_加盟商经营汇总 | 每个加盟商名下门店的经营汇总 |\n| dws_加盟回本测算 | 每家加盟店投了多少、回了多少、预计几个月回本、风险等级 |\n| dws_员工导购效能 | 每个导购拉新、复购带动的效能 |\n| dws_体验口碑汇总 | 评价、投诉汇总成门店体验分 |\n\n### ADS 驾驶舱（8）\n\n| 数据集 | 一句话 |\n|---|---|\n| ads_高层经营驾驶舱 | 给老板：大盘营收、会员销售、触达后关联销售与风险信号 |\n| ads_会员私域驾驶舱 | 给会员负责人：活跃、新增、触达、会员销售占比 |\n| ads_会员经营任务池 | 给运营：待办的会员经营任务清单 |\n| ads_门店每日指挥台 | 给店长：今天该看的数、该做的事 |\n| ads_活动权益复盘 | 给营销：每场活动的核销、触达后关联与增量测算状态 |\n| ads_单店利润健康 | 给财务 / 拓展：每店利润健康度 |\n| ads_加盟商单店报告 | 给加盟商：他自己店的经营报告 |\n| ads_异常归因清单 | 数据异动的归因线索清单 |\n\n### DQC 质检 + param 参数（5）\n\n| 数据集 | 一句话 |\n|---|---|\n| dqc_归因清单对账 | 两条链路算同一个数，对不上就报警 |\n| param_会员生命周期阈值 | 几天算沉睡、几天算流失，阈值配置 |\n| param_门店会员占比预警阈值 | 不同门店类型的会员订单占比月度下降预警线 |\n| param_利润健康阈值 | 利润健康度的分档线 |\n| param_豁免日历 | 大促 / 特殊日期豁免名单（防止误判异常） |\n\n> **复刻这套体系，先填这四张表。**\n> `param_` 参数表是整套 ETL 的阈值配置中心：哪些日期算豁免不报警、多少天不来算沉睡、会员占比下降多少报警、利润率多少算健康，都写在这里——而不是硬编码进公式。v1.4.1 已把原先误名的生命周期参数拆成真正的 `param_会员生命周期阈值` 与 `param_门店会员占比预警阈值`。\n\n## 12 张看板\n\n从老板到店长到加盟商，每个角色一张自己的报表。清单见 [清单/看板清单.csv](./清单/看板清单.csv)，每张的卡片明细在 [看板/页面文档/](./看板/页面文档/)。\n\n01 高层经营驾驶舱 · 02 会员私域驾驶舱 · 03 会员经营任务池 · 04 门店每日指挥台 · 05 活动权益复盘 · 06 体验风险专题 · 07 单店利润健康 · 08 加盟商单店报告 · 09 总览（ECharts 重构版）· 10 异常归因作战页 · 外卖业绩近 30 天 GMV（卖了多少钱）· 参赛作品提交页\n\n## 公式库（60+ 段可复用、上线前须验证的 SQL）\n\n样板间给你看结构，公式库提供算法参考。[公式库/](./公式库/) 蒸馏自两段连锁餐饮 BI 实战履职（已全脱敏，约 3100 行），2026-07-12 从 majia-guanyuan 迁入本仓库统一维护，按主题分 10 册：\n\n| 分册 | 管什么 |\n|---|---|\n| [01 日期与时间](./公式库/01-date-and-time.md) | T-1、本月、近 N 天、用餐时段、跨月对齐、观远时间宏 |\n| [02 顾客与会员](./公式库/02-customer-and-membership.md) | 新老客、消费频次 3 口径、复购（跨天 vs 非跨天）、RFM 8 类 × 营销策略、留存流失 |\n| [03 营收 KPI](./公式库/03-revenue-kpi.md) | 客单价 AC、ADS、ADT、Comp 同店、会员贡献占比 |\n| [04 渠道与门店](./公式库/04-channel-and-store.md) | 堂食外卖分流、门店生命周期、多渠道评价 pipeline |\n| [05 券与折扣](./公式库/05-coupon-and-discount.md) | 核销率、折扣率、折扣分桶、注册首张券 |\n| [06 SQL 工具箱](./公式库/06-sql-utils.md) | 字符串拆解、开窗排名、累计窗口 |\n| [07 数据质量坑](./公式库/07-data-quality-traps.md) | NULL / 空串 / 'null' 三态、口径歧义、通用字段词典 |\n| [08 ETL 工程范式](./公式库/08-etl-engineering-patterns.md) | DWD 宽表底座、财务双源对账、POS 归一化、Cohort 网格 |\n| [09 生产 ETL 索引](./公式库/09-etl-catalog.md) | 39 个生产 ETL 按 11 个业务域的索引与复用决策表 |\n| [10 任务与触达回收](./公式库/10-task-and-touch-recovery.md) | 白盒 NBA 任务池模型、九类任务×圈选依据、防打扰与仲裁、漏斗四率回收、差评客户挽回 |\n\n总入口和\"5 条最容易踩的坑\"见 [公式库/README.md](./公式库/README.md)。**样板间的表结构 + 公式库的算法，两样凑齐，是方案评审和二次开发的图纸；生产上线还要完成字段映射、口径确认和回归验收。**\n\n## 一场直播，把这套东西讲了一遍\n\n2026 年 7 月，这套体系的设计思路在观远「对话 AI Hero」直播里完整讲过一次（AI 创新赛一等奖作品《区域运营的一天》）：区域运营一上午的巡店分析，AI 怎么压缩到几分钟，怎么归因到人、怎么学会闭嘴、怎么多看一眼。\n\n**[📖 分享/区域运营的一天/](./分享/区域运营的一天/README.md)** —— 34 页插画板全嵌的书面实录，当时演示的数据环境就是本仓库。想先看故事再翻表的，从这里进。\n\n## 目录结构（怎么翻）\n\n```\n清单/          三张总清单 CSV（数据集 / ETL / 看板，含 ID）——先看这里拿全景\n公式库/        餐饮 BI 公式实战库（README + 10 册）★ 算法和口径 SQL 都在这\n分享/          直播分享书面实录（34 页插画长文）★ 想先看故事的从这进\n数据集/\n  结构定义/    每个数据集的字段结构说明 ★ 最值得先看\n  数据样本/    每表最多 200 行模拟样本 CSV（小表按实际规模），表头即当前 schema\n  原始JSON/    观远平台 v1.4.0 历史快照（审计用）\nETL/\n  逻辑SQL/     25 条加工链的节点结构和 SQL 逻辑 ★ 口径都在这\n  公共口径/    v1.4.2 事实桥 / 时间规范 / 规则任务 + 业务验收 SQL ★ 多链共用的正确性底座\n  原始JSON/    v1.4.0 workshop 历史快照（不是 v1.4.1 可导入包）\n看板/\n  页面文档/    v1.4.1 校正后的卡片字段清单\n  页面JSON/    v1.4.0 页面布局历史快照（旧字段，不可直接导入）\nskillhub/      ⚙️ 自动生成产物（ClawHub / npm 发布包的瘦身文本子集）\n               勿手动修改——改根目录再跑 python3 tools/build_skillhub_bundle.py\ntools/         构建脚本（含 --check 漂移检测模式）\n```\n\n## 三种用法\n\n**① 业务同学：对照自查。** 打开 [数据集/数据样本/dws_会员RFM分层.csv](./数据集/数据样本/)，你嘴里的\"复购\"\"流失\"\"分层\"在数据里就长这样。拿 [清单/数据集清单.csv](./清单/数据集清单.csv) 当清单，对照你公司现在的会员体系，缺哪层、缺哪几张表，一眼看得出来。\n\n**② 数据同学：改造字段和口径。** [结构定义](./数据集/结构定义/)里有全部字段，[逻辑SQL](./ETL/逻辑SQL/) 与 [公共口径](./ETL/公共口径/) 里有加工口径，[公式库](./公式库/) 里有复购 / RFM（按最近来没来、来得勤不勤、花得多不多给顾客分层）/ 核销等算法。先完成自家字段映射、边界条件和小样本回放，再进入生产。SQL 方言是 Spark 3.4。\n\n**③ 参考复刻。** 用观远 BI 的话，`原始JSON` 可帮助理解原 workshop 的节点 DAG，但它仍是 v1.4.0 历史快照；请先把 v1.4.1 的校正逻辑重新落到目标平台再运行。不用观远也没关系，五层结构和字段设计仍可作为跨平台架构样板。\n\n## 让 AI 替你干活（推荐）\n\n这个库特意做成了 AI Agent 友好的。把仓库地址扔给你的 AI 工具（WorkBuddy / Claude Code / Codex / Cursor……），直接说人话：\n\n- \"对照这个库，看看我们公司的会员数据还缺什么\"\n- \"把 dws_会员RFM分层 的口径翻译成我们数仓的建表语句\"\n- \"照这套结构，给我出一版我们品牌的会员看板规划\"\n\nAI 会自己顺着 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md) 找到路，不用你解释仓库结构。\n\n## 🎛 当 Agent Skill 用\n\n本仓库同时是一个 **Agent Skill**（[SKILL.md](./SKILL.md) 在仓库根部）——装进任何支持 SKILL.md 的 agent（Claude Code / OpenClaw / Codex / WorkBuddy …），它就变成一个随叫随到的**会员数据顾问**，能干十类活：口径与公式咨询、**会员运营动作的数据依据**（召回/提频/防流失该圈谁、何时触达、给什么力度、派给谁、怎么回收）、**CDP 与标签体系设计**（OneID 身份打通、人群圈选、标签规则外置）、从零设计会员数据体系、现有体系缺口诊断、生成建表 DDL、按角色规划看板、数据质量排障、方法论内训、观远整套复刻。\n\n```bash\n# ClawHub / OpenClaw\nclawhub install majia-huiyuan\nopenclaw skills install majia-huiyuan\n\n# GitHub CLI（gh 2.90+）\ngh skill install maojiebc/majia-huiyuan majia-huiyuan --agent claude-code --scope user\n\n# 手动 clone 到对应 agent 的 skills 目录\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.claude/skills/majia-huiyuan   # Claude Code\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.codex/skills/majia-huiyuan    # Codex\n```\n\n装完试一句：\"帮我看看我们公司的会员数据体系缺什么\"，或者\"复购率的口径给我几种标准算法\"。\n\n## 数据说明（必读）\n\n- **全部数据由程序模拟生成**，与任何真实企业无关；手机号等个人标识列已打码（形如 `156****0925`）\n- 仓库内每表附模拟样本，明细大表最多 200 行、参数和小表按实际样例规模；完整规模（如会员 8 万、订单 129 万）标在各表的结构定义里\n- JSON 里的资源 ID 是 workshop 实例私有的，复刻时会生成你自己的\n- 快照时间 2026-06-24，导出工具为观远官方 `guancli`；统一运行参数 `as_of_date` 也默认使用该日\n- `原始JSON` 与 `看板/页面JSON` 保留的是历史平台快照；v1.4.1 的修复以 `ETL/逻辑SQL`、`ETL/公共口径`、`看板/页面文档` 和自动验收为准\n- 结构定义若同时保留平台历史字段，会在文件顶部标出 `v1.4.1 结构覆盖`；当前 CSV 样本表头已按该覆盖口径同步，不能用下方明确标注的 v1.4.0 历史字段反推新表\n\n## 兄弟项目\n\n| 项目 | 关系 |\n|---|---|\n| [majia-siyu](https://github.com/maojiebc/majia-siyu-team) | 私域经营动作入口。**朋友圈、群发、欢迎语、社群触达与整盘经营诊断在那边；指标、公式、SQL 与看板在本库。** |\n| [majia-guanyuan](https://github.com/maojiebc/majia-guanyuan) | 观远 BI 实战增益层 skill。**工具与踩坑手册在那边，数据与公式在这边**；本库的模拟中台和公式库都源自它，现独立迭代 |\n\n## 路线图\n\n- [ ] **口径卡片**：每张核心表配一页\"这张表回答什么业务问题\"\n- [ ] **通用建表 DDL**：不用观远也能一键建表的 SQL 版本\n- [x] **实战问题入口**：[从门店问题开始](公式库/实战问题入口.md)，覆盖注册归因、激励、核销、开业留客、读数、召回与储值事件；内容为脱敏整理和方法建议，非经营效果证明\n- [ ] **行业变体**：茶饮 / 正餐 / 零售的差异字段说明\n- [ ] 字段词典中英对照\n\n想看哪个先做，[提个 issue](https://github.com/maojiebc/majia-huiyuan/issues) 投票。\n\n## 📋 版本记录\n\n- **v1.4.5**（2026-09-14）补齐有效新增、奖励结算、券批次与观察期、开业回收和储值事件；明确模拟示例与经营效果边界。\n- **v1.4.4**（2026-09-07）实战问题入口、包内链接与 WorkBuddy ZIP 检查。\n- **v1.4.3**（2026-09-03）WorkBuddy 单专家适配与平台契约检查。\n\n完整历史见 [CHANGELOG](https://github.com/maojiebc/majia-huiyuan/blob/main/CHANGELOG.md)。\n\n## FAQ\n\n**是真实数据吗？** 不是，全部模拟生成，放心引用结构、不要引用数值。\n**能商用吗？** MIT 协议，能，注明出处就行。\n**我不用观远 BI，这库对我有用吗？** 有。五层结构、55 张逻辑表的字段设计和 25 条链的参考口径都可跨平台评审；具体 SQL 仍要按引擎和自家数据验证。\n**发现错误 / 想要新内容？** [提 issue](https://github.com/maojiebc/majia-huiyuan/issues)。你提一条，这套东西就厚一点。\n\n## 👤 作者 / 联系\n\n**马甲（@maojiebc）** · 超级马甲 · 14 年用户运营，连锁餐饮\"数据与运营之间的翻译官\"\n\n| 渠道 | 链接 |\n|---|---|\n| 📧 Email | [m9224@163.com](mailto:m9224@163.com) |\n| 🐙 GitHub | [github.com/maojiebc](https://github.com/maojiebc) |\n| 🐦 X | [@maojiebc](https://x.com/maojiebc) |\n| 📕 小红书 | [超级马甲](https://xhslink.com/m/4fQMJeHHWKC) |\n| 📰 微信公众号 | [超级马甲](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzY5NzIzODk2NA==#wechat_redirect) |\n\n> 踩过的坑、总结的经验，不叫私有，是群策群力。\n\nFile v1.4.5:公式库/README.md\n\n# 餐饮零售 BI 公式实战库\n\n> 蒸馏自两段连续的餐饮 BI 分析师履职（**餐饮连锁 A + 餐饮连锁 B**，均为多门店连锁餐饮品牌），覆盖**观远 BI / Guandata** 平台上的常用 ETL SQL、卡片表达式、时间宏；第 [10 册](10-task-and-touch-recovery.md)另以本仓库样板间的任务池实现为蓝本。所有品牌名、表名、密集业务字段已去敏，可自由复用。\n\n门店问题先读 [实战问题入口](实战问题入口.md)：注册归因、激励结算、核销排错、开业留客、日常读数与储值事件。口径仍由下面 10 册统一维护。\n\n## 路由表\n\n| 我要算 / 处理 | 去 |\n|---|---|\n| 日期范围（T-1、本月、上月、近 N 天）、用餐时段、时间宏、跨月对齐 | [01-date-and-time.md](01-date-and-time.md) |\n| 新老客 / 会员属性 / 消费频次 / 复购 / 留存 / 流失 / **RFM 8 类 × 营销策略** / R 阈值多档分级 | [02-customer-and-membership.md](02-customer-and-membership.md) |\n| AC / ADS / ADT / AUD / Comp / TC_CRM% / NS_CRM% / 营收占比 | [03-revenue-kpi.md](03-revenue-kpi.md) |\n| 堂食 vs 外卖渠道分流 / 订单子渠道大 case / 门店生命周期 / StoreDate / 成长类型 / **多渠道评价 Pipeline** | [04-channel-and-store.md](04-channel-and-store.md) |\n| 核销率 / 折扣率 / 折扣分桶 / 首张券 / 30 天优惠订单比例 | [05-coupon-and-discount.md](05-coupon-and-discount.md) |\n| `regexp_extract` / `explode-split` / `collect_set-concat_ws` / 开窗排名 / 字段拆解 | [06-sql-utils.md](06-sql-utils.md) |\n| NULL / 空字符串 / 'null' 字面值三态 / 字段口径歧义 / 通用字段词典 | [07-data-quality-traps.md](07-data-quality-traps.md) |\n| **ETL 工程范式**（10-CTE DWD 宽表 / 轻节点重 SQL vs 重节点轻 SQL / 财务双源对账 / POS 归一化 / Cohort 网格）| [08-etl-engineering-patterns.md](08-etl-engineering-patterns.md) |\n| **39 个 V1 生产 ETL 索引清单**（按 11 个业务域分类 + 每 ETL 的节点/输入/输出/SQL 节点速查 + 复用决策表）| [09-etl-catalog.md](09-etl-catalog.md) |\n| **任务与触达回收**（白盒 NBA 任务池模型 / 九类任务×优先级×圈选依据 / 任务生成 SQL / 防打扰与仲裁 / 漏斗四率回收 / **差评客户挽回**）| [10-task-and-touch-recovery.md](10-task-and-touch-recovery.md) |\n\n## 通用字段词典\n\nETL 输入表统一称作 `input1`（观远 SmartETL 默认入参名），其余字段命名约定如下。**本库所有 SQL 都使用这套约定，复用时按你方实际字段名重命名即可。**\n\n| 词典名 | 含义 | 等价别名（你可能遇到的） |\n|---|---|---|\n| `订单号` | 订单唯一 ID | `OrderKey` / `order_id` / `券包订单ID` |\n| `订单日期` | 业务日期 | `businessDate` / `report_date` |\n| `下单时间` | 含时分秒的下单时刻 | `OrderTime` / `create_time` |\n| `去税营业额` | 营收口径（剔税） | `去税营业额 NS` / `income_应收` / `NS` |\n| `含税营业额` | 营收口径（含税） | `含税营业额 GS` / `total` / `GS` |\n| `原价金额` | 折扣前金额 | `原价金额 ALA_Sales` / `ALA` / `original_price` |\n| `折扣金额` | 让利金额 | `Discount` |\n| `销量` | 商品件数 | `QTY` |\n| `订单产品` | 商品名字符串 | `Items` / `names` / `names_grill` |\n| `顾客标识` | 跨渠道统一顾客 ID（优先级：会员卡号 > 微信 openid > 支付宝 user_id > 云闪付 user_id） | — |\n| `会员卡号` | 会员 ID | `MemberShipID` / `dis_cardno` / `card_no` |\n| `是否会员` | 二值或三值标记 | `MemberType` / `IsMember` |\n| `门店编号` | 门店唯一 ID | `StoreID` / `store_code` |\n| `门店名称` | 门店中文名 | `store_name` / `SHOP_NAME` |\n| `分公司` | 区域分公司 | `注册所属分公司` / `归属分公司` |\n| `渠道ID` | 数字化渠道码（外卖、堂食、自取等） | `CHANNEL_ID` |\n| `来源类型` | 二级来源（微信/支付宝/拼单/POS 等） | `FromType` / `OrderSource` |\n| `业务渠道` | 一级归类（堂食/外卖） | `Channel` / `业务渠道划分` |\n| `StoreDate` | `CONCAT(门店编号, '_', 营业日期)`，作为门店×日的唯一键 | — |\n| `Comp` 标记 | 是否同店可比 | `IsComp` |\n| `TC` | 客流数 / 订单笔数 | — |\n\n## 5 条最容易踩的坑（TL;DR）\n\n1. **`COUNT(DISTINCT IF(cond, x, NULL))` 才正确，写 `IF(cond, x, 0)` 会把 0 也计数一个。** → 详见 [07](07-data-quality-traps.md#null-vs-0)\n2. **顾客标识三态**：`NULL` / 空字符串 `''` / 字面量 `'null'` 必须**三个都判**，否则统计会漂。 → [07](07-data-quality-traps.md#三态判断)\n3. **`COUNT(订单号)` 和 `COUNT(DISTINCT 订单号)` 不一样**：拼单订单一单多行，分母不去重会重复。 → [03](03-revenue-kpi.md#客单价-ac)\n4. **跨天复购 vs 非跨天复购口径要明示**：`COUNT(DISTINCT 订单日期)>=2` 和 `COUNT(DISTINCT 订单号)>=2` 是两条曲线，不要混用。 → [02](02-customer-and-membership.md#复购口径)\n5. **观远时间宏 `{{{...}}}` 必须三个花括号**，少一个就被当字符串：`{{{yesterday}}}` / `{{{monday last week - 28 days}}}` / `{{{%2025-12-12}}}`。 → [01](01-date-and-time.md#时间宏)\n\n## 编排建议\n\n- **写新 ETL 节点之前**：先看 [01](01-date-and-time.md)（确定时间范围）+ [07](07-data-quality-traps.md)（确定字段三态处理），再去对应业务文件抄公式。\n- **建卡 / 写卡片字段表达式**：直接去 [03](03-revenue-kpi.md) / [05](05-coupon-and-discount.md) 拿对应 KPI。\n- **接到\"为什么这俩数对不上\"的甩锅**：去 [07](07-data-quality-traps.md) 对一遍口径，80% 是 NULL / 重复字段名 / 三态判断不一致。\n- **分层做完要落成运营动作**（召回 / 提频 / 任务派导购）：去 [10](10-task-and-touch-recovery.md) 抄任务池模型和回收口径——分层是弹药，任务池是扳机。\n\n## 来源标记\n\n- 🅰️ = 餐饮连锁 A 实战\n- 🅱️ = 餐饮连锁 B 实战\n- ⚪ = 两家通用 / 行业通用\n- 🏠 = 本仓库样板间实现（模拟数据，结构与口径可引用，数值不可当基准；主要出现在 [10 册](10-task-and-touch-recovery.md)）\n\n格式参考 [02-customer-and-membership.md](02-customer-and-membership.md) 第一段。\n\nFile v1.4.5:分享/区域运营的一天/README.md\n\n# 区域运营的一天 · 直播分享全记录（34 页插画版）\n\n> 2026 年 7 月 9 日，观远数据「对话 AI Hero」第一期直播，我把 AI 创新赛一等奖作品《区域运营的一天》从头到尾讲了一遍，线上 70 多人，讲了一个多小时。这份文档是那场直播的书面整理版：34 页插画板全部嵌入，讲述文字从直播逐字稿蒸馏而来，去掉了口水话，保留了当时真实讲的内容和现场问答。\n>\n> 当时演示用的整套数据环境有 54 个数据集、25 条 ETL、12 张看板；v1.4.1 将误名参数表拆分后，当前仓库为 55 个逻辑数据集——看完这篇，回到 [仓库首页](../../README.md) 就能查看完整模拟中台。\n\n---\n\n## 一、开场：这是一场什么分享\n\n![](images/a1.jpg)\n\n作品叫《区域运营的一天》。一句话：区域运营过去要花一上午干的巡店分析，让 AI 压缩到几分钟——不是做一张更快的报表，是把\"发现问题、分析原因、推动行动\"这条每天必走的动作链整个交给 AI 跑，人只做最后的拍板。\n\n![](images/a2.jpg)\n\n先交代我是谁：我不是数据分析师出身，是业务，在门店堆里泡了十几年的用户运营，做过到家、做过实体零售，现在在连锁餐饮负责会员体系。我自己搭过 BI 看板、导过数据集，但算不上专业人士——正因为不专业，这套东西对我这种人能跑通，对你大概率也能。\n\n![](images/a3.jpg)\n\n路线四站：先讲区域运营的一天有多烦（痛点），再讲 AI 接手之后的一天长什么样（方案），然后回答 AI 凭什么可信（底座），最后当场真跑三个问题（演示）。\n\n![](images/a4.jpg)\n\n直播时我说这不是汇报，是聊天，有疑问随时打断。落到这份文档：读到哪觉得不对，[提个 issue](https://github.com/maojiebc/majia-huiyuan/issues) 就是打断我。\n\n## 二、痛点：一上午是怎么被吃掉的\n\n![](images/b1.jpg)\n\n给主角取了个花名，花十六，区域督导，管几十家店，一年大部分时间在辖区里跑。他每天早上的活：翻三个看板——利润的、口碑的、会员的——找出哪家店红了；发现一家在亏，打电话问店长，店长说\"隔壁店也这样\"；只好拉 Excel 人肉对口径，你说的口径是 A，他理解的是 B。一上午过去，只够看几家店。我们这行还有个背景：BI 权限往往下放不到一线督导，大家实际流转的还是企业微信里的本地 Excel。\n\n![](images/b2.jpg)\n\n我们之前也试过各种智能体、机器人，它们很勤奋，不断弹通知：这个指标跌了、那个数据负增长。但大部分是无效信息。预警一多，等于没有预警。\n\n![](images/b3.jpg)\n\n更要命的是误报比漏报贵。报警信息一旦出错，一线的人第一反应不是\"数据有问题\"，是\"AI 很蠢\"——信任这个东西，错一次，你再想让他给第二次机会，很难。\n\n![](images/b4.jpg)\n\n演示环境 1200 家店里，P0 级严重亏损 103 条，集中在约 30 家门店，连着几个月失血。真正贵的不是亏损本身，是归因延迟：从\"被报警\"到\"搞清为什么、谁去管\"，中间隔着的每一天都是钱。\n\n## 三、方案：AI 跑五步，人拍最后一板\n\n![](images/c1.jpg)\n\n现在花十六只问一句大白话：\"今天哪些店要我管？为什么？谁去管？\"不用把需求翻译成技术语言。顺带说个口径的老梗：顾客一天内下两单算不算复购？隔天下第二单才算？这种口径争议在我们早期吵了很久——大白话提问的前提，是口径已经有人钉死在表里（这正是本仓库[公式库](../../公式库/)管的事）。\n\n![](images/c2.jpg)\n\nAI 替他跑五步：**发现**（运营、利润、口碑、会员四路监控合成一张待办清单）、**归因**（异常出在房租、人工、客群还是口碑，沿数仓下钻排除）、**豁免**（寒暑假的学校店、爬坡期的新店，这些\"不该报的\"自动挡掉）、**派单**（每条异常带责任人、风险等级、建议动作）、**通知**（按区域经理分组生成日报）。\n\n![](images/c3.jpg)\n\n自动化的边界停在\"发送\"之前。日报生成好、推送模板备好，最后由人确认再发出。我试下来，不管多强的模型，最后的判断替代不了人——这也是每个经验丰富的业务、分析师真正的竞争力所在。\n\n## 四、底座：AI 凭什么可信\n\n![](images/d1.jpg)\n\n讲到这里通常会被问：这些判断，AI 凭什么？答案是它不凭感觉，它读的是一套业务看得懂、改得动、可对账的数据资产。\n\n![](images/d2.jpg)\n\n四件套。**参数表**：9 种店型乘 7 个参数的差异化阈值——商场店房租上限 28%、社区店 12%，判断标准从人脑和代码里搬进一张表；**归因清单**：四路异常合流成唯一出口，6115 行，每行带归因、责任人、建议动作，不再是两个地方查出两套结论；**对账自检**：九项检查每次重跑自动重跑，机器查机器；**护栏**：全量 103 条 P0 无一被豁免，\"闭嘴\"绝不闭出漏报。护栏这个思路是通用的——直播前一天我批量生成这些插画，就给流程加了一条\"检查图里中文有没有乱码，有就重生成\"，做数、做图、做文案，都得有收尾那道检查。\n\n![](images/d3.jpg)\n\n给数据打标签、建多维数据集，是老概念，AI 时代反而绕不开：字段有没有注释、有没有歧义，直接决定 AI 读出来的是判断还是猜测。\n\n![](images/d4.jpg)\n\n这套 demo 我是从零建的，但落回真实企业不需要推倒重来——现有 BI 资产全保留，只做增量。不过我想多说一句\"推倒重来的勇气\"：历史数据乱、字段没注释、前辈写的逻辑不敢碰，是每家的常态，我以前改一处报错就吓得回滚。现在 AI 能读全库，我第一次有了底气把 30 多条 ETL 理成十几条、把上千张没人打开的看板砍到几百张——推不推倒是选择，敢不敢推倒是能力。\n\n## 五、工具层：眼睛和手\n\n![](images/e1.jpg)\n\n我一开始以为 CLI 是给人看的说明书，后来才明白：它是给 AI 用的命令行，相当于 AI 的鼠标和界面。大模型是现成的大脑，缺的从来是眼睛和手——CLI 让 AI 看得懂你的数据资产（哪张是参数表、字段什么含义），也够得着（能查、能建、能跑）。\n\n![](images/e2.jpg)\n\n整个演示项目就是这么长出来的：我只提了一个朴素需求——\"帮我模拟一家 1200 家店的咖啡连锁，把该有的底表都建了\"。AI 生成了几十张表：会员、订单、积分、私域、加盟分账、门店成本，字段是真的（从我十几年业务经历里蒸馏的），数据是假的（全部模拟）。这套东西现在就躺在本仓库里。\n\n![](images/e3.jpg)\n\nETL 也进化了：从在画布上拖节点，到一段 SQL 直接跑。说实话，AI 写的不少 SQL 已经超出我的阅读能力，我找专业伙伴看过，他说能看懂大半——我不跟 AI 抢功劳，我出的是业务需求，它出的是工程。\n\n![](images/e4.jpg)\n\n以前\"把数据结构推倒重梳理\"是个大项目，现在是几分钟的事。改口径不用等排期：规则在表里不在代码里，业务改一个数字，重跑一次，清单自动重排。\n\n![](images/e5.jpg)\n\n那些没人想干的琐碎活——批量重命名、字段加注释、清理没人用的表——AI 全包了。\n\n![](images/e6.jpg)\n\n看板这块我的真实用法：我不懂 HTML，我只会说\"这个看板有点丑，能不能用自定义的方式做好看一点\"。它就去调自定义图表，颜色不满意再换。重点是数据源不是本地 Excel，是直接读库里的字段，自动更新，分享链路跟原生看板完全一样。\n\n![](images/e7.jpg)\n\n手机端看板过去是个大工程——在手机屏幕那么点地方拖模块，我搭过几次，实在不愿意再来。\n\n![](images/e8.jpg)\n\n现在是\"说出来就有\"，顺手还多一张二维码，扫码即看。我为什么执念移动端：后台数据不会骗人，一百张 PC 看板里，一个月被打开的寥寥无几；一线的人在路上，手机里能看清的数据才是真的在被用的数据。\n\n## 六、真演示：现场三个问题\n\n![](images/f1.jpg)\n\n演示规则：我全程只打中文，不写一行 SQL、不敲一条命令，查什么表、走什么路径都是 AI 自己决定的。有观众要提示词，我的提示词真的超简单，就是\"深圳有家店亏钱了，帮我看看是房租太贵、人工太高、原料涨价还是客流掉了，给我能落地的整改动作，指到责任人\"。\n\n![](images/f2.jpg)\n\n跑任务的等待时间本来准备了五分钟的解说词，结果这次不到一分钟就出结果了。等待也不是死时间——看它先去摸口径、看字段定义在哪，摸完才查数，这个\"先对口径再干活\"的习惯，比很多人强。\n\n![](images/f3.jpg)\n\n背景资料它开跑前已经读完：门店主档、豁免日历、参数表、归因清单，全在库里。\n\n![](images/f4.jpg)\n\n**三个问题，现场连问三层：**\n\n**第一问，为什么亏（归因到人）。** 深圳一家购物中心店连亏几个月。AI 排除了人工（没超）、原料（毛利率在升）、客流（营收高于同类中位），锁定房租：占比超商场店 28% 的上限五六个百分点，当月净利亏六千五。然后它做了一件我没让它做的事——横向对比深圳所有商场店，发现好几家房租全超标，这就不是一家店的经营问题，是深圳商场租金的结构性问题，得升到招商议价层去谈。最后落到人：店长袁十六复盘出品和服务，区域经理花十六去谈房租。\n\n**第二问，该不该报（AI 会闭嘴）。** 宁波一家校园店 2 月起营收从两万多掉到一万，月度亏损，系统要不要报？AI 说不报：学校店，2 月是寒假，豁免日历拦下——三四月开学后营收恢复，4 月还进了标杆，反向证明这次闭嘴闭对了。兰州一家开业六周的新店连亏被打了\"关店评估\"，AI 也把它捞回来：正常爬坡曲线，给它一点时间。这是我这次最想讲的部分：大家都在摸索 AI 能做什么，我已经让它做了很多，我现在琢磨的是怎么让它**不做**什么。\n\n**第三问，没报警就没问题吗（会多看一眼）。** 青岛一家购物中心店，看板上月月达标、还是标杆门店，但加盟商在私下吐槽。我就把这句话当提示词：\"这家店好像不太行，但我说不上来哪里不行，帮我挖一挖\"——第六感也可以是提示词。AI 像侦探一样顺藤摸瓜：利润没问题、堂食没问题，最后挖到评价——负评占比从 0 一路阴跌到 20%，每天的跌幅都够不到单日报警线，所以清单抓不到。结论给到店长：赶紧处理差评、回访客户；给到区域经理：你报上来的标杆门店，可能名不副实。\n\n**收口是日报。** 所有结果写成按区域经理分组的日报，谁家该复盘出品、谁家该回复差评，每人领自己的任务，通过 webhook 推到企业微信或飞书群——由人确认后发送，五步走完。\n\n## 七、你关心的五件事\n\n![](images/g1.jpg)\n\n直播间 70 多人，我预设了四种人：业务、数据分析师、IT、老板。这一节按人群回答当场的问题。\n\n![](images/g2.jpg)\n\n**权限（IT 最关心）。** AI 不开新口子，走的是老门：CLI 的权限就是你账号的权限，你是管理员就能看全库，你只有自己那几张表就只能看那几张。想认真做这件事，建议给公司里的超级个体开尽量多的**只读**权限，跑出结果再决定权限下放给谁。\n\n![](images/g3.jpg)\n\n**口径乱能不能起步（业务最关心）。** 能，但别做全局治理——挑最疼的一个场景先修一条路。我自己的起步案例：每天一份会员拉新日报，全国分公司排名，前三名表扬、倒数三名鞭策，发到管理层都在的群。为什么挑它？因为大家真的关心——上榜的人有融入感，被批评的人会较真，数据一错他们立马反馈。就这么磨了三四个星期，跟会员相关的字段 AI 基本就不出错了。遇到的坑主要一类：历史字段重名、没注释，AI 混淆——给字段打个括号、重新起个精准的名字，修修补补就好。\n\n![](images/g4.jpg)\n\n**模型怎么选。** 不重要，别用太便宜的就行。方法不绑模型，好马随时换。真正决定上限的是你维护的数据底表——底表干净到位，你别说 AI 了，随便来个新手分析师也能很快定位问题；底表烂，多强的模型都是快速地错。\n\n![](images/g5.jpg)\n\n**要不要立项组队。** 不用。一个人、一个普通的 agent 工具、每天免费领的那点额度，授权自己账号能读的数据集，用口语跟它说\"帮我查一下某家店\"，就能开始。在以前，这些事要提需求文档、等 IT 评审、等排期、等资源，反复沟通几个星期；现在一个业务自己就能跑通。\n\n## 八、收尾\n\n![](images/h1.jpg)\n\n过去是人打开报表来读，未来是 AI 读报表、人读结论。BI 的新角色不是\"看数据的地方\"，是\"替业务干活的助手\"。这不是贩卖焦虑——它给你的是一个可实操的出路，而且实操的成本低到一个人就能开始。\n\n![](images/h2.jpg)\n\n直播最后的核心意思，是把业务判断沉淀成可复核的参考口径。当时演示的整套环境有 54 个数据集、25 条 ETL、12 张看板；v1.4.1 拆分参数表后，当前仓库为 55 个逻辑数据集。复购、RFM、核销这些参考口径在[公式库](../../公式库/)；上线前仍需结合自家字段与数据验证。AI 时代真正落袋的，不是一张看板或一份日报，是你作为业务、作为人，在行业里那部分有价值的判断——把它沉淀出来，AI 才用得上，别人才接得住。\n\n---\n\n## 附：当场问答摘编\n\n**问：提示词怎么写才能让它查得准？**\n答：两个小技巧。一是把数据集或看板的网址直接复制给它，或者告诉它文件夹名字，它能精准定位；二是提问可以带上你的预判（\"我猜是房租，也可能是人工\"），它会逐个验证排除。\n\n**问：预警阈值需要人工输入吗？**\n答：分两类。寒暑假、新店爬坡这类**规则性豁免**要人维护在表里；数值阈值它会自己横向对比同店型、同城市的门店得出——我们没给它写死任何报警线。\n\n**问：怎么验证 AI 出的数据是对的？**\n答：老实说，除了人工复核没有银弹。我的做法是两道：我自己先验一遍再发出去；然后靠业务同学——他们对自己的数据最敏锐，错一点立马找上门。所以我发 AI 产出时会说明\"这是 AI 出的，大家多提意见\"，让反馈回路转起来。\n\n**问：已经用了两年 BI，怎么开始 AI 探索？**\n答：一个我觉得好用的姿势——带着批判的视角，用\"反派\"的方式问 AI：\"你现在是管理员，这套数据集和看板是两年攒下来的，我觉得非常冗余、非常糟糕，帮我批阅一下。\"别客气、别含蓄，它会挖出很多你想不到的东西。\n\n---\n\n*本文由 2026-07-09 直播逐字稿整理，演示数据全部为模拟生成（字段真实、数值虚构），与任何真实企业无关。插画板 34 页由 AI 批量生成（含中文乱码自检护栏），原始尺寸文件与生成管线未随仓库分发。*\n\n*讲述：马甲（@maojiebc）· 整理自直播实录*\n\nFile v1.4.5:_meta.json\n\n{\n  \"ownerId\": \"kn71njkqkab6a75db7hqb6ekz982jd29\",\n  \"slug\": \"majia-huiyuan\",\n  \"version\": \"1.4.5\",\n  \"publishedAt\": 1789359763927\n}\n\nFile v1.4.5:AGENTS.md\n\n# AGENTS.md — 给 AI Agent 的操作指引\n\n你正在访问的是一套**连锁餐饮会员数据中台参考实现**（模拟数据），五层数仓架构（DIM / DWD / DWS / ADS / DQC）。v1.4.1 的逻辑 SQL 已在原观远 BI workshop 快照上校正；原始 JSON 仍保留为历史审计资产。你的用户大概率是业务或数据分析背景，不是工程师——回答时先人话，后术语。\n\n## 事实速查\n\n| 项 | 值 |\n|---|---|\n| 逻辑数据集 | 55 个（DIM 10 / DWD 16 / DWS 16 / ADS 8 / DQC 1 / param 4） |\n| ETL 加工链 | 25 条 |\n| 看板 | 12 张 |\n| 模拟规模 | 会员 80,000 / 门店 1,200 / 加盟商 141 / 商品 74 / 订单 1,294,316 / 触达 500,000 |\n| 快照时间 | 2026-06-24 |\n| SQL 方言 | Spark 3.4 |\n| 协议 | MIT |\n| 数据真实性 | **全部模拟生成**，个人标识已打码 |\n| 公式库 | `公式库/` 10 册约 3100 行：60+ SQL（复购 / RFM / 核销 / DWD 范式 / 任务池 NBA 模型）+ 字段词典 + 39 生产 ETL 索引（蒸馏自真实履职，已脱敏；第 10 册以本仓库样板间为蓝本） |\n\n## 任务导航（你被要求做 X → 去读 Y）\n\n| 任务 | 路径 |\n|---|---|\n| 拿整体资产全景 | `清单/数据集清单.csv`、`清单/ETL清单.csv`、`清单/看板清单.csv`（列：分层,名称,ID） |\n| 门店新增怎么算、激励怎么结、核销下降、开业留客、储值何时到账 | `公式库/实战问题入口.md`；先区分事件与观察期，再转具体公式及私域执行 |\n| 查复购 / RFM / 核销等通用公式、字段词典、数据质量坑 | `公式库/README.md` 总入口（路由表 + 5 大坑），按主题进 10 册 |\n| 用户要做召回 / 提频 / 防流失 / 新客转化 / 派任务给导购 | `公式库/10-task-and-touch-recovery.md`（任务池 NBA 模型：九类任务×圈选依据×回收口径）+ 圈选源 `dws_会员生命周期` / `dws_会员RFM分层` / `dws_渠道迁移分析`；执行话术切 majia-siyu |\n| 用户要搭 CDP / 标签体系 / 身份打通 | `数据集/结构定义/dim_会员身份桥.md`（OneID 五类身份+匹配置信度）+ `公式库/02` 开篇顾客标识统一化 + `param_` 参数表模式（标签规则外置） |\n| 向用户讲解这套体系的设计思路 / 为什么这么设计 | `分享/区域运营的一天/README.md`（叙事版：痛点→五步→可信四件套→三案例，引用其中案例时注明数据为模拟） |\n| 解释某个指标 / 口径怎么算 | `ETL/逻辑SQL/` 下按表名找对应 md，读节点结构和 SQL |\n| 查归因、券、活动三条公共事实桥 | `ETL/公共口径/`；订单级唯一性、统一快照和业务验收以这里为准 |\n| 列出某张表的字段 | `数据集/结构定义/<表名>.md`（含字段数、行数、字段类型、维度/度量属性） |\n| 看字段实际长什么样 | `数据集/数据样本/<表名>.csv`（最多 200 行模拟样本，小表按实际规模；表头即当前 schema） |\n| 帮用户设计会员数据体系 | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 顺序讲，每层用途见 README「三分钟看懂」 |\n| 生成建表语句 | 用 `数据集/数据样本/*.csv` 表头 + `结构定义` 的类型信息推 schema |\n| 诊断用户现有体系的缺口 | 把 55 个逻辑数据集当 checklist，逐层对照用户已有的表 |\n| 复刻整套到观远 BI | 原始 JSON 只用于理解 v1.4.0 workshop DAG；按 v1.4.1 `逻辑SQL/` + `公共口径/` 在目标平台重建，平台操作切 majia-guanyuan |\n| 理解某张看板的构成 | 以 `看板/页面文档/<看板名>.md` 的 v1.4.1 字段清单为准；`看板/页面JSON/` 仅保留 v1.4.0 历史布局，含旧字段，不可直接导入 |\n\n## 命名与文件约定\n\n- **分层前缀**：`dim_` 档案 / `dwd_` 事件明细 / `dws_` 汇总 / `ads_` 应用报表 / `dqc_` 质检 / `param_` 阈值参数\n- **ETL 文件名**中括号内是节点构成缩写：`F`=FILTER_ROWS 过滤、`C`=CALCULATOR 计算、`G`=GROUP_BY 聚合、`S`=SQL_SCRIPT、`J`=JOIN_DATA 关联，`×N`=同类节点数。例：`etl_dws_会员RFM分层 (10节点·F+C+G+S+J)`\n- **同一资产的三种形态**：\n  - `结构定义/*.md` — guancli 导出的描述文档（最适合你直接读）\n  - `数据样本/*.csv` — 最多 200 行模拟数据，小表按实际规模（schema 与取值范围的示例）\n  - `原始JSON/*.json` — v1.4.0 平台历史定义，含完整节点 DAG（审计用，不是 v1.4.1 可导入包）\n- 关键身份字段：`会员ID`（M 前缀）、`门店ID`（S 前缀）、`顾客识别键`（跨渠道统一身份，配 `身份匹配置信度`），身份合并逻辑见 `dim_会员身份桥`\n\n## 硬约束（违反会误导用户）\n\n1. **数据是模拟的**：可以引用结构、字段、口径、比例关系的设计思路；**不可**把数值当真实经营数据引用或外推行业结论。\n2. **ID 不可移植**：JSON 内的资源 ID（数据集 / ETL / 卡片 ID）是 workshop 实例私有的，复刻时必须重新生成。\n3. **SQL 是 Spark 3.4 方言**：搬到其他引擎（MySQL / ClickHouse / PG）时注意函数差异，主动提醒用户。\n4. **引用要带路径**：向用户引用本库内容时，标注来源文件的相对路径，方便核对。\n5. 手机号等打码字段（`156****0925`）不要尝试补全或生成完整号码。\n6. **SQL 是待验证示例**：不得承诺“换表名即可生产”；上线前必须完成字段映射、小样本回放和业务不变量验收。\n7. **归因不等于增量**：没有随机对照或合格准实验时，只能叫“触达后关联/归因 GMV”，不能叫“贡献销售/增量 ROI”。\n\n## 推荐回答姿态\n\n- 用户问\"复购怎么算\"这类口径问题：先给一句人话结论，再贴 `ETL/逻辑SQL/` 里的对应逻辑，最后提醒口径可选项（如跨天 vs 非跨天）。\n- 用户要\"照着搭一套\"：不要一次吐 55 张表，按 DIM→DWD→DWS→ADS 分阶段给最小可用集（先档案+订单流水，再算汇总，再上报表）。\n- 口径类问题优先交叉引用本仓库 `公式库/`（通用 SQL 公式）与 `ETL/逻辑SQL/`（本样板间的实际实现），两处口径一致时置信度最高。\n\nFile v1.4.5:ETL/逻辑SQL/ads_会员私域驾驶舱.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 4\n- **节点类型分布:**\n  - INPUT_DATASET: 2\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - j23ea7e60564e47458b71d82 (dwd_订单)\n  - xc82fb232ecdc474f84cd43d (dwd_会员触达)\n- **数据输出目标:**\n  - ads_会员私域驾驶舱 (目录: 0523-马甲-demo)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818731\n- Name: dwd_订单\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (200,100)\n- InputDsId: j23ea7e60564e47458b71d82\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818732\n- Name: dwd_会员触达\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (200,250)\n- InputDsId: xc82fb232ecdc474f84cd43d\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点3\n- Id: id_1779326818733\n- Name: SQL处理\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818731 (dwd_订单)\n  - id_1779326818732 (dwd_会员触达)\n\n- **Used By (Outputs):**\n  - id_1779326818734 (ads_会员私域驾驶舱)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p\n```\n- 等价SQL:\n```sql\nWITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p\n```\n\n\n### 节点4\n- Id: id_1779326818734\n- Name: ads_会员私域驾驶舱\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (800,100)\n- OutputDsName: ads_会员私域驾驶舱\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 0523-马甲-demo\n- DataSourceDsId: p2bcc84756ad94855896dd97\n- DataSourceCreated: true\n- DirPath: 根目录 > 0523-马甲-demo\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (2)\n- **dwd_订单** (DATA_SET_FILE)\n  - ID: j23ea7e60564e47458b71d82\n- **dwd_会员触达** (DATA_SET_FILE)\n  - ID: xc82fb232ecdc474f84cd43d\n\n### 下游资源 (1)\n- **ads_会员私域驾驶舱** (DATA_SET_ETL)\n  - ID: p2bcc84756ad94855896dd97\n\nFile v1.4.5:ETL/逻辑SQL/ads_会员经营任务池.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 6\n- **节点类型分布:**\n  - INPUT_DATASET: 4\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - sedfdd84abacc4cb496c15e7 (dim_门店主档)\n  - u494a5b2caaf446b5b1ed8bf (dwd_会员经营任务)\n  - h551155a12fc04d88a57d319 (dim_会员主档)\n  - m6fdb5eaefa5742ef9e0ac58 (dim_员工导购)\n- **数据输出目标:**\n  - ads_会员经营任务池 (目录: 马甲的demo-0523)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818732\n- Name: dim_门店主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,400)\n- InputDsId: sedfdd84abacc4cb496c15e7\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818735\n- Name: ads_会员经营任务池\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (800,100)\n- OutputDsName: ads_会员经营任务池\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: nda316bda403346669b3fa1d\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点3\n- Id: id_1779326818730\n- Name: dwd_会员经营任务\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,100)\n- InputDsId: u494a5b2caaf446b5b1ed8bf\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点4\n- Id: id_1779326818734\n- Name: SQL处理\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818730 (dwd_会员经营任务)\n  - id_1779326818731 (dim_员工导购)\n  - id_1779326818732 (dim_门店主档)\n  - id_1779326818733 (dim_会员主档)\n\n- **Used By (Outputs):**\n  - id_1779326818735 (ads_会员经营任务池)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS as_of_date\n),\nstore_current AS (\n  SELECT * FROM input3 WHERE `当前版本标记` = 1\n)\nSELECT\n  t.`任务ID`, t.`任务优先级`, t.`任务类型`, t.`任务来源`,\n  t.`会员ID`, m.`会员等级`, m.`城市` AS `会员城市`,\n  t.`归属门店ID`, s.`门店名称`, s.`城市` AS `门店城市`, s.`店型`, s.`门店类型`,\n  t.`员工导购ID`, e.`姓名` AS `员工姓名`, e.`岗位`, e.`角色标签`,\n  t.`人群标签`, t.`推荐动作`, t.`推荐权益`, t.`推荐原因`,\n  t.`预计价值`, t.`任务生成时间`, t.`任务截止时间`, t.`任务失效时间`,\n  t.`触达状态`, t.`触达时间`, t.`触达方式`,\n  t.`触达后下单`, t.`触达后下单金额`, t.`任务结果`,\n  CASE\n    WHEN t.`任务结果` LIKE '已完成%' THEN '已完结'\n    WHEN t.`任务失效时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY THEN '已过期'\n    ELSE '进行中'\n  END AS `执行状态`,\n  CASE\n    WHEN t.`触达后下单` = 1 THEN '有转化'\n    WHEN t.`触达状态` = '已触达' THEN '已触达未转化'\n    ELSE '未触达'\n  END AS `转化阶段`,\n  p.as_of_date AS `数据快照日期`\nFROM input1 t\nLEFT JOIN input2 e ON t.`员工导购ID` = e.`员工ID`\nLEFT JOIN store_current s ON t.`归属门店ID` = s.`门店ID`\nLEFT JOIN input4 m ON t.`会员ID` = m.`会员ID`\nCROSS JOIN params p\nWHERE t.`任务生成时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY\n```\n- 等价SQL:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS as_of_date\n),\nstore_current AS (\n  SELECT * FROM input3 WHERE `当前版本标记` = 1\n)\nSELECT\n  t.`任务ID`, t.`任务优先级`, t.`任务类型`, t.`任务来源`,\n  t.`会员ID`, m.`会员等级`, m.`城市` AS `会员城市`,\n  t.`归属门店ID`, s.`门店名称`, s.`城市` AS `门店城市`, s.`店型`, s.`门店类型`,\n  t.`员工导购ID`, e.`姓名` AS `员工姓名`, e.`岗位`, e.`角色标签`,\n  t.`人群标签`, t.`推荐动作`, t.`推荐权益`, t.`推荐原因`,\n  t.`预计价值`, t.`任务生成时间`, t.`任务截止时间`, t.`任务失效时间`,\n  t.`触达状态`, t.`触达时间`, t.`触达方式`,\n  t.`触达后下单`, t.`触达后下单金额`, t.`任务结果`,\n  CASE\n    WHEN t.`任务结果` LIKE '已完成%' THEN '已完结'\n    WHEN t.`任务失效时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY THEN '已过期'\n    ELSE '进行中'\n  END AS `执行状态`,\n  CASE\n    WHEN t.`触达后下单` = 1 THEN '有转化'\n    WHEN t.`触达状态` = '已触达' THEN '已触达未转化'\n    ELSE '未触达'\n  END AS `转化阶段`,\n  p.as_of_date AS `数据快照日期`\nFROM input1 t\nLEFT JOIN input2 e ON t.`员工导购ID` = e.`员工ID`\nLEFT JOIN store_current s ON t.`归属门店ID` = s.`门店ID`\nLEFT JOIN input4 m ON t.`会员ID` = m.`会员ID`\nCROSS JOIN params p\nWHERE t.`任务生成时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY\n```\n\n\n### 节点5\n- Id: id_1779326818733\n- Name: dim_会员主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,550)\n- InputDsId: h551155a12fc04d88a57d319\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点6\n- Id: id_1779326818731\n- Name: dim_员工导购\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,250)\n- InputDsId: m6fdb5eaefa5742ef9e0ac58\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (4)\n- **dwd_会员经营任务** (DATA_SET_FILE)\n  - ID: u494a5b2caaf446b5b1ed8bf\n- **dim_门店主档** (DATA_SET_FILE)\n  - ID: sedfdd84abacc4cb496c15e7\n- **dim_员工导购** (DATA_SET_FILE)\n  - ID: m6fdb5eaefa5742ef9e0ac58\n- **dim_会员主档** (DATA_SET_FILE)\n  - ID: h551155a12fc04d88a57d319\n\n### 下游资源 (1)\n- **ads_会员经营任务池** (DATA_SET_ETL)\n  - ID: nda316bda403346669b3fa1d\n\nFile v1.4.5:ETL/逻辑SQL/ads_门店每日指挥台.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 5\n- **节点类型分布:**\n  - INPUT_DATASET: 3\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - sedfdd84abacc4cb496c15e7 (dim_门店主档)\n  - af8234caa4e90486793eaab8 (dwd_评价)\n  - j23ea7e60564e47458b71d82 (dwd_订单)\n- **数据输出目标:**\n  - ads_门店每日指挥台 (目录: 马甲的demo-0523)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818730\n- Name: dim_门店主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,250)\n- InputDsId: sedfdd84abacc4cb496c15e7\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818731\n- Name: dwd_评价\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,400)\n- InputDsId: af8234caa4e90486793eaab8\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点3\n- Id: id_1779326818733\n- Name: ads_门店每日指挥台\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (800,100)\n- OutputDsName: ads_门店每日指挥台\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: nd177a0ac0eda44ac98c75bc\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点4\n- Id: id_1779326818732\n- Name: 营业日历骨架+日指标+自然日基线\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818729 (dwd_订单)\n  - id_1779326818730 (dim_门店主档)\n  - id_1779326818731 (dwd_评价)\n\n- **Used By (Outputs):**\n  - id_1779326818733 (ads_门店每日指挥台)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS `as_of_date` -- 生产由调度参数替换\n),\nstore_current AS (\n  -- 当前版本只负责提供每家门店唯一的开闭店边界。\n  SELECT\n    s.`门店ID`, s.`开业日期`,\n    CASE WHEN s.`闭店日期` IS NULL OR TRIM(s.`闭店日期`) = '' OR LOWER(TRIM(s.`闭店日期`)) = 'null'\n         THEN NULL ELSE TO_DATE(s.`闭店日期`) END AS `闭店日期`\n  FROM input2 s\n  WHERE s.`当前版本标记` = 1\n),\nstore_bounds AS (\n  SELECT s.`门店ID`, s.`开业日期`, COALESCE(s.`闭店日期`, p.`as_of_date`) AS `营业截止日期`, p.`as_of_date`\n  FROM store_current s\n  CROSS JOIN params p\n  WHERE s.`开业日期` IS NOT NULL\n    AND s.`开业日期` <= p.`as_of_date`\n    AND COALESCE(s.`闭店日期`, p.`as_of_date`) >= s.`开业日期`\n),\nstore_calendar AS (\n  -- 门店×自然营业日期骨架：即使当天 0 单也会有一行。\n  SELECT s.`门店ID`, d.`业务日期`, s.`as_of_date` AS `数据快照日期`\n  FROM store_bounds s\n  LATERAL VIEW EXPLODE(SEQUENCE(\n    s.`开业日期`,\n    LEAST(s.`as_of_date`, s.`营业截止日期`),\n    INTERVAL 1 DAY\n  )) d AS `业务日期`\n),\norder_daily AS (\n  SELECT\n    o.`门店ID`, o.`业务日期`,\n    COUNT(DISTINCT o.`订单ID`) AS `订单数`,\n    SUM(o.`实付金额`) AS `销售额`,\n    COUNT(DISTINCT CASE WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`订单ID` END) AS `会员订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 1 THEN o.`订单ID` END) AS `到店订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 0 THEN o.`订单ID` END) AS `外卖订单数`,\n    SUM(o.`折扣金额`) AS `折扣总额`,\n    SUM(o.`原价金额`) AS `原价总额`\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成' AND o.`业务日期` <= p.`as_of_date`\n  GROUP BY o.`门店ID`, o.`业务日期`\n),\nreview_daily AS (\n  SELECT\n    r.`门店ID`, r.`评价日期` AS `业务日期`,\n    AVG(r.`评分`) AS `当日评分`,\n    COUNT(*) AS `当日评价数`,\n    SUM(CASE WHEN r.`评分` <= 2 AND r.`回复状态` = '未回复' THEN 1 ELSE 0 END) AS `未回复负评数`\n  FROM input3 r\n  CROSS JOIN params p\n  WHERE r.`评价日期` <= p.`as_of_date`\n  GROUP BY r.`门店ID`, r.`评价日期`\n),\nstore_asof AS (\n  SELECT\n    b.`门店ID`, b.`业务日期`, b.`数据快照日期`,\n    s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`, s.`开业日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY b.`门店ID`, b.`业务日期`\n      ORDER BY s.`生效起始日期` DESC, s.`门店版本ID` DESC\n    ) AS scd_rn\n  FROM store_calendar b\n  LEFT JOIN input2 s\n    ON b.`门店ID` = s.`门店ID`\n   AND b.`业务日期` >= s.`生效起始日期`\n   AND b.`业务日期` <= COALESCE(s.`生效截止日期`, DATE '9999-12-31')\n),\njoined AS (\n  SELECT\n    s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`,\n    CASE WHEN DATEDIFF(s.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN 'TRUE' ELSE 'FALSE' END AS `是否90天内新店`,\n    CASE WHEN DATEDIFF(s.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN '90天新店' ELSE '成熟店' END AS `新店标签`,\n    s.`业务日期`, COALESCE(o.`订单数`, 0) AS `订单数`, COALESCE(o.`销售额`, 0) AS `销售额`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`销售额` / o.`订单数` ELSE NULL END AS `平均客单价_基线口径`,\n    COALESCE(o.`会员订单数`, 0) AS `会员订单数`, COALESCE(o.`到店订单数`, 0) AS `到店订单数`,\n    COALESCE(o.`外卖订单数`, 0) AS `外卖订单数`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`会员订单数` * 1.0 / o.`订单数` ELSE 0 END AS `会员订单占比`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`到店订单数` * 1.0 / o.`订单数` ELSE 0 END AS `到店占比`,\n    CASE WHEN COALESCE(o.`原价总额`, 0) > 0 THEN o.`折扣总额` / o.`原价总额` ELSE 0 END AS `折扣率`,\n    COALESCE(r.`当日评分`, 5) AS `当日评分`, COALESCE(r.`当日评价数`, 0) AS `当日评价数`,\n    COALESCE(r.`未回复负评数`, 0) AS `未回复负评数`,\n    COALESCE(o.`折扣总额`, 0) AS `折扣总额`, COALESCE(o.`原价总额`, 0) AS `原价总额`,\n    s.`数据快照日期`\n  FROM store_asof s\n  LEFT JOIN order_daily o ON s.`门店ID` = o.`门店ID` AND s.`业务日期` = o.`业务日期`\n  LEFT JOIN review_daily r ON s.`门店ID` = r.`门店ID` AND s.`业务日期` = r.`业务日期`\n  WHERE s.scd_rn = 1\n),\nwith_baseline AS (\n  SELECT *,\n    -- 因骨架每天一行，ROWS 14 PRECEDING 就是前 14 个自然日；AVG 自动忽略零订单日的 NULL 客单价。\n    AVG(`平均客单价_基线口径`) OVER (\n      PARTITION BY `门店ID` ORDER BY `业务日期` ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING\n    ) AS `客单价基线`\n  FROM joined\n)\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `店型`, `门店类型`,\n  `商圈`, `是否90天内新店`, `新店标签`,\n  `业务日期`, `订单数`, `销售额`, COALESCE(`平均客单价_基线口径`, 0) AS `平均客单价`,\n  `会员订单数`, `到店订单数`, `外卖订单数`, `会员订单占比`, `到店占比`, `折扣率`,\n  `当日评分`, `未回复负评数`,\n  CASE\n    WHEN `订单数` = 0 THEN '客流异常' -- 覆盖闭店、断数、POS 未上传等最严重场景\n    WHEN `订单数` < 5 THEN '客流异常'\n    WHEN `未回复负评数` >= 1 THEN '口碑异常'\n    WHEN `当日评价数` >= 2 AND `当日评分` <= 3.0 THEN '评分滑坡'\n    WHEN `原价总额` > 0 AND `折扣总额` / `原价总额` > 0.30 THEN '折扣过高'\n    WHEN `订单数` >= 10 AND `会员订单数` * 1.0 / `订单数` < 0.10 THEN '会员占比异常'\n    WHEN `订单数` >= 10 AND `客单价基线` IS NOT NULL\n         AND `平均客单价_基线口径` < 0.4 * `客单价基线` THEN '客单价异常'\n    ELSE '正常'\n  END AS `今日异常`,\n  `数据快照日期`\nFROM with_baseline\n\n```\n- 等价SQL:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS `as_of_date` -- 生产由调度参数替换\n),\nstore_current AS (\n  -- 当前版本只负责提供每家门店唯一的开闭店边界。\n  SELECT\n    s.`门店ID`, s.`开业日期`,\n    CASE WHEN s.`闭店日期` IS NULL OR TRIM(s.`闭店日期`) = '' OR LOWER(TRIM(s.`闭店日期`)) = 'null'\n         THEN NULL ELSE TO_DATE(s.`闭店日期`) END AS `闭店日期`\n  FROM input2 s\n  WHERE s.`当前版本标记` = 1\n),\nstore_bounds AS (\n  SELECT s.`门店ID`, s.`开业日期`, COALESCE(s.`闭店日期`, p.`as_of_date`) AS `营业截止日期`, p.`as_of_date`\n  FROM store_current s\n  CROSS JOIN params p\n  WHERE s.`开业日期` IS NOT NULL\n    AND s.`开业日期` <= p.`as_of_date`\n    AND COALESCE(s.`闭店日期`, p.`as_of_date`) >= s.`开业日期`\n),\nstore_calendar AS (\n  -- 门店×自然营业日期骨架：即使当天 0 单也会有一行。\n  SELECT s.`门店ID`, d.`业务日期`, s.`as_of_date` AS `数据快照日期`\n  FROM store_bounds s\n  LATERAL VIEW EXPLODE(SEQUENCE(\n    s.`开业日期`,\n    LEAST(s.`as_of_date`, s.`营业截止日期`),\n    INTERVAL 1 DAY\n  )) d AS `业务日期`\n),\norder_daily AS (\n  SELECT\n    o.`门店ID`, o.`业务日期`,\n    COUNT(DISTINCT o.`订单ID`) AS `订单数`,\n    SUM(o.`实付金额`) AS `销售额`,\n    COUNT(DISTINCT CASE WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`订单ID` END) AS `会员订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 1 THEN o.`订单ID` END) AS `到店订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 0 THEN o.`订单ID` END) AS `外卖订单数`,\n    SUM(o.`折扣金额`) AS `折扣总额`,\n    SUM(o.`原价金额`) AS `原价总额`\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成' AND o.`业务日期` <= p.`as_of_date`\n  GROUP BY o.`门店ID`, o.`业务日期`\n),\nreview_daily AS (\n  SELECT\n    r.`门店ID`, r.`评价日期` AS `业务日期`,\n    AVG(r.`评分`) AS `当日评分`,\n    COUNT(*) AS `当日评价数`,\n    SUM(CASE WHEN r.`评分` <= 2 AND r.`回复状态` = '未回复' THEN 1 ELSE 0 END) AS `未回复负评数`\n  FROM input3 r\n  CROSS JOIN params p\n  WHERE r.`评价日期` <= p.`as_of_date`\n  GROUP BY r.`门店ID`, r.`评价日期`\n),\nstore_asof AS (\n  SELECT\n    b.`门店ID`, b.`业务日期`, b.`数据快照日期`,\n    s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`, s.`开业日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY b.`门店ID`, b.`业务日期`\n      ORDER BY s.`生效起始日期` DESC, s.`门店版本ID` DESC\n    ) AS scd_rn\n  FROM store_calendar b\n  LEFT JOIN input2 s\n    ON b.`门店ID` = s.`门店ID`\n   AND b.`业务日期` >= s.`生效起始日期`\n   AND b.`业务日期` <= COALESCE(s.`生效截止日期`, DATE '9999-12-31')\n),\njoined AS (\n  SELECT\n    s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`,\n    CASE WHEN DATEDIFF(s.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN 'TRUE' ELSE 'FALSE' END AS `是否90天内新店`,\n    CASE WHEN DATEDIFF(s.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN '90天新店' ELSE '成熟店' END AS `新店标签`,\n    s.`业务日期`, COALESCE(o.`订单数`, 0) AS `订单数`, COALESCE(o.`销售额`, 0) AS `销售额`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`销售额` / o.`订单数` ELSE NULL END AS `平均客单价_基线口径`,\n    COALESCE(o.`会员订单数`, 0) AS `会员订单数`, COALESCE(o.`到店订单数`, 0) AS `到店订单数`,\n    COALESCE(o.`外卖订单数`, 0) AS `外卖订单数`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`会员订单数` * 1.0 / o.`订单数` ELSE 0 END AS `会员订单占比`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`到店订单数` * 1.0 / o.`订单数` ELSE 0 END AS `到店占比`,\n    CASE WHEN COALESCE(o.`原价总额`, 0) > 0 THEN o.`折扣总额` / o.`原价总额` ELSE 0 END AS `折扣率`,\n    COALESCE(r.`当日评分`, 5) AS `当日评分`, COALESCE(r.`当日评价数`, 0) AS `当日评价数`,\n    COALESCE(r.`未回复负评数`, 0) AS `未回复负评数`,\n    COALESCE(o.`折扣总额`, 0) AS `折扣总额`, COALESCE(o.`原价总额`, 0) AS `原价总额`,\n    s.`数据快照日期`\n  FROM store_asof s\n  LEFT JOIN order_daily o ON s.`门店ID` = o.`门店ID` AND s.`业务日期` = o.`业务日期`\n  LEFT JOIN review_daily r ON s.`门店ID` = r.`门店ID` AND s.`业务日期` = r.`业务日期`\n  WHERE s.scd_rn = 1\n),\nwith_baseline AS (\n  SELECT *,\n    -- 因骨架每天一行，ROWS 14 PRECEDING 就是前 14 个自然日；AVG 自动忽略零订单日的 NULL 客单价。\n    AVG(`平均客单价_基线口径`) OVER (\n      PARTITION BY `门店ID` ORDER BY `业务日期` ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING\n    ) AS `客单价基线`\n  FROM joined\n)\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `店型`, `门店类型`,\n  `商圈`, `是否90天内新店`, `新店标签`,\n  `业务日期`, `订单数`, `销售额`, COALESCE(`平均客单价_基线口径`, 0) AS `平均客单价`,\n  `会员订单数`, `到店订单数`, `外卖订单数`, `会员订单占比`, `到店占比`, `折扣率`,\n  `当日评分`, `未回复负评数`,\n  CASE\n    WHEN `订单数` = 0 THEN '客流异常' -- 覆盖闭店、断数、POS 未上传等最严重场景\n    WHEN `订单数` < 5 THEN '客流异常'\n    WHEN `未回复负评数` >= 1 THEN '口碑异常'\n    WHEN `当日评价数` >= 2 AND `当日评分` <= 3.0 THEN '评分滑坡'\n    WHEN `原价总额` > 0 AND `折扣总额` / `原价总额` > 0.30 THEN '折扣过高'\n    WHEN `订单数` >= 10 AND `会员订单数` * 1.0 / `订单数` < 0.10 THEN '会员占比异常'\n    WHEN `订单数` >= 10 AND `客单价基线` IS NOT NULL\n         AND `平均客单价_基线口径` < 0.4 * `客单价基线` THEN '客单价异常'\n    ELSE '正常'\n  END AS `今日异常`,\n  `数据快照日期`\nFROM with_baseline\n\n```\n\n\n### 节点5\n- Id: id_1779326818729\n- Name: dwd_订单\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,100)\n- InputDsId: j23ea7e60564e47458b71d82\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (3)\n- **dwd_订单** (DATA_SET_FILE)\n  - ID: j23ea7e60564e47458b71d82\n- **dim_门店主档** (DATA_SET_FILE)\n  - ID: sedfdd84abacc4cb496c15e7\n- **dwd_评价** (DATA_SET_FILE)\n  - ID: af8234caa4e90486793eaab8\n\n### 下游资源 (1)\n- **ads_门店每日指挥台** (DATA_SET_ETL)\n  - ID: nd177a0ac0eda44ac98c75bc\n\nFile v1.4.5:ETL/逻辑SQL/ads_高层经营驾驶舱.md\n\n你是一个 ETL 专家，正在查看如下 ETL 的定义。所有节点运行在 Apache Spark 3.4，SQL 只能使用 Spark SQL。\n\n## 基本信息\n\n- UniformResourceType: DATA_PROCESS_ETL\n- 版本口径: v1.4.1\n\n## ETL 流程摘要\n\n- **数据输入源:**\n  - `dwd_订单`\n  - `dwd_会员触达`\n- **数据输出目标:** `ads_高层经营驾驶舱`\n- **运行参数:** `as_of_date`，必填，格式 `yyyy-MM-dd`；调度器在运行前替换 `${as_of_date}`。\n- **归因窗口:** 触达时间起（含）至触达时间后 8×24 小时（不含），即滚动 0–7 天。\n\n## v1.4.1 业务口径\n\n1. 总销售、会员销售、到店销售和关联销售全部按订单发生日汇总，分子分母处于同一天。\n2. 私域订单只允许归属于下单前最近一次有效触达；用 `ROW_NUMBER` 将同一订单的归因优先级固定为 1，杜绝重复归因。\n3. 归因 CTE 名称必须是 `bridge_触达订单归因`，口径对齐 `ETL/公共口径/01_触达订单归因桥.sql`，保留订单/触达键便于 DQC 逐单审计。生产落地时应先物化公共桥再引用。\n4. 没有对照组时，只能称“触达后关联销售”，不能称“私域贡献销售”或增量收入。\n5. 原字段“到店订单占比”实际按销售额计算，v1.4.1 更名为“到店销售额占比”。\n\n## 核心 SQL\n\n输入顺序：`input1 = dwd_订单`，`input2 = dwd_会员触达`。\n\n```sql\nWITH params AS (\n  SELECT\n    CAST('${as_of_date}' AS DATE) AS `as_of_date`,\n    7 AS `归因窗口天数`\n),\nvalid_order AS (\n  SELECT o.*\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成'\n    AND o.`业务日期` <= p.`as_of_date`\n),\nvalid_touch AS (\n  SELECT t.*\n  FROM input2 t\n  CROSS JOIN params p\n  WHERE t.`触达状态` = '已发送'\n    AND t.`会员ID` IS NOT NULL AND t.`会员ID` <> ''\n    AND t.`触达日期` <= p.`as_of_date`\n),\norder_daily AS (\n  SELECT\n    o.`业务日期`,\n    SUM(o.`实付金额`) AS `总销售`,\n    SUM(CASE\n      WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`实付金额`\n      ELSE 0\n    END) AS `会员销售`,\n    SUM(CASE WHEN o.`是否到店` = 1 THEN o.`实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT o.`订单ID`) AS `总订单数`,\n    COUNT(DISTINCT o.`会员ID`) AS `活跃会员数`,\n    COUNT(DISTINCT CASE WHEN o.`是否会员首单` = 1 THEN o.`会员ID` END) AS `新增会员数`\n  FROM valid_order o\n  GROUP BY o.`业务日期`\n),\ntouch_order_candidates AS (\n  SELECT\n    o.`订单ID`,\n    t.`触达ID`,\n    t.`触达时间`,\n    o.`下单时间`,\n    o.`业务日期` AS `订单发生日期`,\n    o.`实付金额`,\n    '下单前最近一次有效触达' AS `归因规则`,\n    ROW_NUMBER() OVER (\n      PARTITION BY o.`订单ID`\n      ORDER BY t.`触达时间` DESC, t.`触达ID` DESC\n    ) AS `归因优先级`\n  FROM valid_order o\n  JOIN valid_touch t\n    ON o.`会员ID` = t.`会员ID`\n   AND o.`会员ID` IS NOT NULL AND o.`会员ID` <> ''\n   AND o.`下单时间` >= t.`触达时间`\n   AND o.`下单时间` < t.`触达时间` + INTERVAL 8 DAYS\n),\nbridge_触达订单归因 AS (\n  SELECT\n    `订单ID`, `触达ID`, `触达时间`, `下单时间`, `订单发生日期`,\n    `实付金额`, `归因规则`, `归因优先级`\n  FROM touch_order_candidates\n  WHERE `归因优先级` = 1\n),\ntouch_order_daily AS (\n  SELECT\n    b.`订单发生日期` AS `业务日期`,\n    COUNT(DISTINCT b.`订单ID`) AS `触达后关联订单数`,\n    SUM(b.`实付金额`) AS `触达后关联销售`\n  FROM bridge_触达订单归因 b\n  GROUP BY b.`订单发生日期`\n)\nSELECT\n  d.`业务日期`,\n  d.`总销售`,\n  d.`会员销售`,\n  d.`到店销售`,\n  d.`总订单数`,\n  d.`活跃会员数`,\n  d.`新增会员数`,\n  COALESCE(a.`触达后关联订单数`, 0) AS `触达后关联订单数`,\n  COALESCE(a.`触达后关联销售`, 0.0) AS `触达后关联销售`,\n  CASE WHEN d.`总销售` > 0 THEN d.`会员销售` / d.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN d.`总销售` > 0 THEN d.`到店销售` / d.`总销售` ELSE 0 END AS `到店销售额占比`,\n  CASE\n    WHEN d.`总销售` > 0 THEN COALESCE(a.`触达后关联销售`, 0.0) / d.`总销售`\n    ELSE 0\n  END AS `触达后关联销售占比`,\n  p.`归因窗口天数`,\n  '下单前最近一次有效触达；每订单唯一' AS `归因规则`,\n  p.`as_of_date` AS `数据快照日期`\nFROM order_daily d\nLEFT JOIN touch_order_daily a\n  ON d.`业务日期` = a.`业务日期`\nCROSS JOIN params p\n```\n\n## 验收约束\n\n- `bridge_触达订单归因` 中 `订单ID` 必须唯一。\n- 每日 `触达后关联订单数 <= 总订单数`。\n- 每日 `触达后关联销售 <= 总销售`，允许因退款冲销或负金额数据触发例外并进入 DQC 人工核验。\n- `会员销售占比`、`到店销售额占比`、`触达后关联销售占比` 在正常非负订单口径下均应处于 `[0, 1]`。\n- 所有业务日期不得晚于 `as_of_date`。\n\n## 血缘关系\n\n- 上游：`dwd_订单`、`dwd_会员触达`\n- 下游：`ads_高层经营驾驶舱`\n\nFile v1.4.5:ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 9\n- **节点类型分布:**\n  - CALCULATOR: 1\n  - INPUT_DATASET: 4\n  - JOIN_DATA: 2\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - l6ee75fc812be413583215e4 (dws_单店利润月汇总)\n  - w55d0570b98a143579807416 (dwd_加盟合同明细)\n  - e620121168c3447c3abe4948 (dim_加盟商主档)\n  - vf66c6e915ad048c49cbcf25 (dws_加盟回本测算)\n- **数据输出目标:**\n  - ads_加盟商单店报告 (目录: 马甲的demo-0523)\n- **时间口径:** 继承 `dws_单店利润月汇总.数据快照日期`，与同批次 `as_of_date` 一致\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779346227920\n- Name: 同侪定位+改进建议+总部支持\n- Type: CALCULATOR\n- **Sources (Inputs):**\n  - id_1779346227919 (关联回本测算)\n\n- **Used By (Outputs):**\n  - id_1779346227921 (ads_加盟商单店报告)\n- Position: (1043,64)\n- FormulaNames:\n  - 本店位置标签\n  - 可改进项\n  - 总部本月支持\n- 等价SQL:\n```sql\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `门店类型`, `商圈`,\n  `加盟商ID`, `加盟商名称`, `加盟商类型`, `合作状态`, `信用等级`, `签约日期`,\n  `月份`, `月营收`, `堂食营收`, `外卖营收`, `订单数`,\n  `毛利`, `店面贡献利润`, `单店净利润`, `毛利率`, `店面贡献利润率`,\n  `堂食占比`, `外卖占比`, `人工占比`, `房租占比`, `客单价`,\n  `同侪门店数`, `城市同店型_营收_P25`, `城市同店型_营收_中位数`, `城市同店型_营收_P75`,\n  `城市同店型_利润率_P25`, `城市同店型_利润率_中位数`, `城市同店型_利润率_P75`,\n  `城市同店型_堂食占比_中位数`, `营收_对中位数比`, `利润率_对中位数差`, `堂食占比_对中位数差`,\n  `总投资额`, `累计店面贡献利润`, `累计回本率`, `预计完整回本月数`, `已开业月数`,\n  `投资起始日`, `剩余回本月数`, `回本状态`, `预计完整回本日期`,\n  `招商承诺回本月数`, `回本偏离度`, `回本风险等级`, `标杆门店标志`,\n  case when `营收_对中位数比` >= 1.5 then '顶部 Top 25%' when `营收_对中位数比` >= 1.1 then '中上 P50-P75' when `营收_对中位数比` >= 0.9 then '中位 ±10%' when `营收_对中位数比` >= 0.7 then '中下 P25-P50' else '尾部 Bottom 25%' end AS `本店位置标签`,\n  case when `店面贡献利润` < 0 then '亏损中, 建议联系督导专项支持' when `营收_对中位数比` < 0.7 then '营收低于同侪 30%+, 建议会员拉新+私域引流' when `堂食占比_对中位数差` < -0.10 then '堂食占比低于同侪 10pp+, 建议堂食提振专题' when `人工占比` > 0.25 then '人工占比偏高, 建议优化排班' when `房租占比` > 0.30 then '房租压力大, 建议提升日均营收' when `利润率_对中位数差` >= 0.05 then '同侪标杆, 持续优秀!' else '运营正常, 继续保持' end AS `可改进项`,\n  case when `合作状态` = '正常合作' then '提供品牌活动 + 私域内容 + 督导巡店' when `合作状态` = '续约预警' then '加强督导 + 专项营销补贴' when `合作状态` = '关注名单' then '高频督导 + 定制运营方案' else '专项处理' end AS `总部本月支持`,\n  `数据快照日期`\nFROM input1\n```\n\n\n### 节点2\n- Id: id_1779346227921\n- Name: ads_加盟商单店报告\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779346227920 (同侪定位+改进建议+总部支持)\n- Position: (1247,64)\n- OutputDsName: ads_加盟商单店报告\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: n7e1bd96a3dcf48e88f18022\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点3\n- Id: id_1779346227918\n- Name: 关联加盟商信息\n- Type: JOIN_DATA\n- **Sources (Inputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n  - id_1779346227915 (dim_加盟商主档)\n\n- **Used By (Outputs):**\n  - id_1779346227919 (关联回本测算)\n- Position: (635,64)\n- 等价SQL:\n```sql\nSELECT\n  f.`门店ID`, f.`门店名称`, f.`省份`, f.`城市`, f.`城市层级`, f.`门店类型`, f.`商圈`,\n  f.`加盟商ID`, d.`加盟商名称`, d.`加盟商类型`, d.`合作状态`, d.`信用等级`, f.`签约日期`,\n  f.`月份`, f.`月营收`, f.`堂食营收`, f.`外卖营收`, f.`订单数`,\n  f.`毛利`, f.`店面贡献利润`, f.`单店净利润`, f.`毛利率`, f.`店面贡献利润率`,\n  f.`堂食占比`, f.`外卖占比`, f.`人工占比`, f.`房租占比`, f.`客单价`,\n  f.`同侪门店数`, f.`城市同店型_营收_P25`, f.`城市同店型_营收_中位数`, f.`城市同店型_营收_P75`,\n  f.`城市同店型_利润率_P25`, f.`城市同店型_利润率_中位数`, f.`城市同店型_利润率_P75`,\n  f.`城市同店型_堂食占比_中位数`, f.`营收_对中位数比`, f.`利润率_对中位数差`, f.`堂食占比_对中位数差`,\n  f.`数据快照日期`\nFROM input1 f\nLEFT JOIN input2 d ON f.`加盟商ID` = d.`加盟商ID`\n```\n\n\n### 节点4\n- Id: id_1779346227919\n- Name: 关联回本测算\n- Type: JOIN_DATA\n- **Sources (Inputs):**\n  - id_1779346227918 (关联加盟商信息)\n  - id_1779346227916 (dws_加盟回本测算)\n\n- **Used By (Outputs):**\n  - id_1779346227920 (同侪定位+改进建议+总部支持)\n- Position: (839,64)\n- 等价SQL:\n```sql\nSELECT\n  f.`门店ID`, f.`门店名称`, f.`省份`, f.`城市`, f.`城市层级`, f.`门店类型`, f.`商圈`,\n  f.`加盟商ID`, f.`加盟商名称`, f.`加盟商类型`, f.`合作状态`, f.`信用等级`, f.`签约日期`,\n  f.`月份`, f.`月营收`, f.`堂食营收`, f.`外卖营收`, f.`订单数`,\n  f.`毛利`, f.`店面贡献利润`, f.`单店净利润`, f.`毛利率`, f.`店面贡献利润率`,\n  f.`堂食占比`, f.`外卖占比`, f.`人工占比`, f.`房租占比`, f.`客单价`,\n  f.`同侪门店数`, f.`城市同店型_营收_P25`, f.`城市同店型_营收_中位数`, f.`城市同店型_营收_P75`,\n  f.`城市同店型_利润率_P25`, f.`城市同店型_利润率_中位数`, f.`城市同店型_利润率_P75`,\n  f.`城市同店型_堂食占比_中位数`, f.`营收_对中位数比`, f.`利润率_对中位数差`, f.`堂食占比_对中位数差`,\n  r.`总投资额`, r.`累计店面贡献利润`, r.`累计回本率`, r.`预计完整回本月数`, r.`已开业月数`,\n  r.`投资起始日`, r.`剩余回本月数`, r.`回本状态`, r.`预计完整回本日期`,\n  r.`招商承诺回本月数`, r.`回本偏离度`, r.`回本风险等级`, r.`标杆门店标志`,\n  f.`数据快照日期`\nFROM input1 f\nLEFT JOIN input2 r\n  ON f.`门店ID` = r.`门店ID`\n AND f.`数据快照日期` = r.`数据快照日期`\n```\n\n\n### 节点5\n- Id: id_1779346227913\n- Name: dws_单店利润月汇总\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n- Position: (227,64)\n- InputDsId: l6ee75fc812be413583215e4\n- DisplayType: DATAFLOW\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点6\n- Id: id_1779346227914\n- Name: dwd_加盟合同明细\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n- Position: (227,232)\n- InputDsId: w55d0570b98a143579807416\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点7\n- Id: id_1779346227915\n- Name: dim_加盟商主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227918 (关联加盟商信息)\n- Position: (431,232)\n- InputDsId: e620121168c3447c3abe4948\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点8\n- Id: id_1779346227916\n- Name: dws_加盟回本测算\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227919 (关联回本测算)\n- Position: (635,232)\n- InputDsId: vf66c6e915ad048c49cbcf25\n- DisplayType: DATAFLOW\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点9\n- Id: id_1779346227917\n- Name: franchise_profit+同城同店型同侪\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779346227913 (dws_单店利润月汇总)\n  - id_1779346227914 (dwd_加盟合同明细)\n\n- **Used By (Outputs):**\n  - id_1779346227918 (关联加盟商信息)\n- Position: (431,64)\n- SqlScript:\n```sql\nWITH franchise_profit_ranked AS (\n  SELECT\n    p.*, c.`加盟商ID`, c.`签约日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY p.`门店ID`, p.`月份`\n      ORDER BY c.`签约日期` DESC, c.`合同ID` DESC\n    ) AS contract_rn\n  FROM input1 p\n  JOIN input2 c\n    ON p.`门店ID` = c.`门店ID`\n   AND CAST(CONCAT(p.`月份`, '-01') AS DATE) BETWEEN c.`签约日期`\n                                                   AND COALESCE(c.`到期日`, DATE '9999-12-31')\n   AND c.`合同状态` <> '已作废'\n),\nfranchise_profit AS (\n  SELECT * FROM franchise_profit_ranked WHERE contract_rn = 1\n),\npeer_baseline AS (\n  SELECT\n    `城市层级`, `门店类型`, `月份`,\n    PERCENTILE_APPROX(`月营收`, 0.25) AS `城市同店型_营收_P25`,\n    PERCENTILE_APPROX(`月营收`, 0.50) AS `城市同店型_营收_中位数`,\n    PERCENTILE_APPROX(`月营收`, 0.75) AS `城市同店型_营收_P75`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.25) AS `城市同店型_利润率_P25`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.50) AS `城市同店型_利润率_中位数`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.75) AS `城市同店型_利润率_P75`,\n    PERCENTILE_APPROX(`堂食占比`, 0.50) AS `城市同店型_堂食占比_中位数`,\n    COUNT(*) AS `同侪门店数`\n  FROM franchise_profit\n  GROUP BY `城市层级`, `门店类型`, `月份`\n)\nSELECT\n  s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`门店类型`, s.`商圈`,\n  s.`加盟商ID`, s.`签约日期`, s.`数据快照日期`,\n  s.`月份`, s.`月营收`, s.`堂食营收`, s.`外卖营收`, s.`订单数`,\n  s.`毛利`, s.`店面贡献利润`, s.`单店净利润`,\n  s.`毛利率`, s.`店面贡献利润率`, s.`堂食占比`, s.`外卖占比`,\n  s.`人工占比`, s.`房租占比`, s.`客单价`,\n  b.`同侪门店数`,\n  b.`城市同店型_营收_P25`, b.`城市同店型_营收_中位数`, b.`城市同店型_营收_P75`,\n  b.`城市同店型_利润率_P25`, b.`城市同店型_利润率_中位数`, b.`城市同店型_利润率_P75`,\n  b.`城市同店型_堂食占比_中位数`,\n  CASE WHEN b.`城市同店型_营收_中位数` > 0\n       THEN s.`月营收` / b.`城市同店型_营收_中位数`\n       ELSE 1 END AS `营收_对中位数比`,\n  s.`店面贡献利润率` - b.`城市同店型_利润率_中位数` AS `利润率_对中位数差`,\n  s.`堂食占比` - b.`城市同店型_堂食占比_中位数` AS `堂食占比_对中位数差`\nFROM franchise_profit s\nLEFT JOIN peer_baseline b ON s.`城市层级` = b.`城市层级` AND s.`门店类型` = b.`门店类型` AND s.`月份` = b.`月份`\n```\n- 等价SQL:\n```sql\nWITH franchise_profit_ranked AS (\n  SELECT\n    p.*, c.`加盟商ID`, c.`签约日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY p.`门店ID`, p.`月份`\n      ORDER BY c.`签约日期` DESC, c.`合同ID` DESC\n    ) AS contract_rn\n  FROM input1 p\n  JOIN input2 c\n    ON p.`门店ID` = c.`门店ID`\n   AND CAST(CONCAT(p.`月份`, '-01') AS DATE) BETWEEN c.`签约日期`\n                                                   AND COALESCE(c.`到期日`, DATE '9999-12-31')\n   AND c.`合同状态` <> '已作废'\n),\nfranchise_profit AS (\n  SELECT * FROM franchise_profit_ranked WHERE contract_rn = 1\n),\npeer_baseline AS (\n  SELECT\n    `城市层级`, `门店类型`, `月份`,\n    PERCENTILE_APPROX(`月营收`, 0.25) AS `城市同店型_营收_P25`,\n    PERCENTILE_APPROX(`月营收`, 0.50) AS `城市同店型_营收_中位数`,\n    PERCENTILE_APPROX(`月营收`, 0.75) AS `城市同店型_营收_P75`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.25) AS `城市同店型_利润率_P25`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.50) AS `城市同店型_利润率_中位数`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.75) AS `城市同店型_利润率_P75`,\n    PERCENTILE_APPROX(`堂食占比`, 0.50) AS `城市同店型_堂食占比_中位数`,\n    COUNT(*) AS `同侪门店数`\n  FROM franchise_profit\n  GROUP BY `城市层级`, `门店类型`, `月份`\n)\nSELECT\n  s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`门店类型`, s.`商圈`,\n  s.`加盟商ID`, s.`签约日期`, s.`数据快照日期`,\n  s.`月份`, s.`月营收`, s.`堂食营收`, s.`外卖营收`, s.`订单数`,\n  s.`毛利`, s.`店面贡献利润`, s.`单店净利润`,\n  s.`毛利率`, s.`店面贡献利润率`, s.`堂食占比`, s.`外卖占比`,\n  s.`人工占比`, s.`房租占比`, s.`客单价`,\n  b.`同侪门店数`,\n  b.`城市同店型_营收_P25`, b.`城市同店型_营收_中位数`, b.`城市同店型_营收_P75`,\n  b.`城市同店型_利润率_P25`, b.`城市同店型_利润率_中位数`, b.`城市同店型_利润率_P75`,\n  b.`城市同店型_堂食占比_中位数`,\n  CASE WHEN b.`城市同店型_营收_中位数` > 0\n       THEN s.`月营收` / b.`城市同店型_营收_中位数`\n       ELSE 1 END AS `营收_对中位数比`,\n  s.`店面贡献利润率` - b.`城市同店型_利润率_中位数` AS `利润率_对中位数差`,\n  s.`堂食占比` - b.`城市同店型_堂食占比_中位数` AS `堂食占比_对中位数差`\nFROM franchise_profit s\nLEFT JOIN peer_baseline b ON s.`城市层级` = b.`城市层级` AND s.`门店类型` = b.`门店类型` AND s.`月份` = b.`月份`\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (4)\n- **dim_加盟商主档** (DATA_SET_FILE)\n  - ID: e620121168c3447c3abe4948\n- **dwd_加盟合同明细** (DATA_SET_FILE)\n  - ID: w55d0570b98a143579807416\n- **dws_单店利润月汇总** (DATA_SET_ETL)\n  - ID: l6ee75fc812be413583215e4\n- **dws_加盟回本测算** (DATA_SET_ETL)\n  - ID: vf66c6e915ad048c49cbcf25\n\n### 下游资源 (1)\n- **ads_加盟商单店报告** (DATA_SET_ETL)\n  - ID: n7e1bd96a3dcf48e88f18022\n\nArchive v1.4.1: 236 files, 1992409 bytes\n\nFiles: AGENTS.md (6034b), assets/icon.png (1186515b), docs/architecture.png (74787b), docs/architecture.svg (9038b), ETL/公共口径/01_触达订单归因桥.sql (1767b), ETL/公共口径/02_券实例核销订单桥.sql (2090b), ETL/公共口径/03_活动参与订单归因桥.sql (1513b), ETL/公共口径/04_v1.4.1_业务验收.sql (5593b), ETL/公共口径/README.md (1945b), ETL/逻辑SQL/ads_会员私域驾驶舱.md (5898b), ETL/逻辑SQL/ads_会员经营任务池.md (6296b), ETL/逻辑SQL/ads_门店每日指挥台.md (14318b), ETL/逻辑SQL/ads_高层经营驾驶舱.md (4946b), ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md (14537b), ETL/逻辑SQL/etl_ads_单店利润健康 (6节点·J+C+S).md (10465b), ETL/逻辑SQL/etl_ads_异常归因清单.md (20762b), ETL/逻辑SQL/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).md (11584b), ETL/逻辑SQL/etl_dqc_归因清单对账.md (12589b), ETL/逻辑SQL/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).md (7908b), ETL/逻辑SQL/etl_dws_会员同期群留存.md (8424b), ETL/逻辑SQL/etl_dws_会员生命周期.md (12720b), ETL/逻辑SQL/etl_dws_体验口碑汇总.md (8363b), ETL/逻辑SQL/etl_dws_券效益分析.md (6089b), ETL/逻辑SQL/etl_dws_加盟商经营汇总 (7节点·S+J+C).md (7999b), ETL/逻辑SQL/etl_dws_加盟回本测算 (9节点·S×3+J+C).md (12880b), ETL/逻辑SQL/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).md (17575b), ETL/逻辑SQL/etl_dws_员工导购效能 (8节点·F+S+J+C).md (8509b), ETL/逻辑SQL/etl_dws_商品销售分析.md (6503b), ETL/逻辑SQL/etl_dws_成本结构汇总 (7节点·J+S+C).md (6007b), ETL/逻辑SQL/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).md (6734b), ETL/逻辑SQL/etl_dws_渠道迁移分析.md (7251b), ETL/逻辑SQL/etl_dws_目标达成.md (5531b), ETL/逻辑SQL/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).md (6100b), ETL/逻辑SQL/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).md (9798b), LICENSE (1097b), llms.txt (2661b), manifest.json (1250b), README.en.md (7564b), README.md (22237b), requirements-dev.txt (17b), skill-card.md (2718b), SKILL.md (11203b), tests/__init__.py (70b), tests/test_business_contracts.py (18917b), tests/test_sample_schemas.py (12407b), 公式库/01-date-and-time.md (7423b), 公式库/02-customer-and-membership.md (27597b), 公式库/03-revenue-kpi.md (7296b), 公式库/04-channel-and-store.md (17694b), 公式库/05-coupon-and-discount.md (5520b), 公式库/06-sql-utils.md (10598b), 公式库/07-data-quality-traps.md (8942b), 公式库/08-etl-engineering-patterns.md (14943b), 公式库/09-etl-catalog.md (14188b), 公式库/10-task-and-touch-recovery.md (12930b), 公式库/README.md (6119b), 分享/区域运营的一天/README.md (15811b), 数据集/数据样本/ads_会员私域驾驶舱.csv (807b), 数据集/数据样本/ads_会员经营任务池.csv (81582b), 数据集/数据样本/ads_加盟商单店报告.csv (150656b), 数据集/数据样本/ads_单店利润健康.csv (83991b), 数据集/数据样本/ads_异常归因清单.csv (56967b), 数据集/数据样本/ads_活动权益复盘.csv (19954b), 数据集/数据样本/ads_门店每日指挥台.csv (42953b), 数据集/数据样本/ads_高层经营驾驶舱.csv (14995b), 数据集/数据样本/dim_会员主档.csv (19518b), 数据集/数据样本/dim_会员身份桥.csv (34513b), 数据集/数据样本/dim_券模板.csv (1864b), 数据集/数据样本/dim_加盟商主档.csv (14666b), 数据集/数据样本/dim_员工导购.csv (15353b), 数据集/数据样本/dim_商品主档.csv (6049b), 数据集/数据样本/dim_成本科目.csv (667b), 数据集/数据样本/dim_日期.csv (13876b), 数据集/数据样本/dim_活动主档.csv (4760b), 数据集/数据样本/dim_门店主档.csv (49367b), 数据集/数据样本/dqc_归因清单对账.csv (804b), 数据集/数据样本/dwd_会员注册绑定.csv (16467b), 数据集/数据样本/dwd_会员经营任务.csv (52515b), 数据集/数据样本/dwd_会员触达.csv (21787b), 数据集/数据样本/dwd_券事件.csv (22617b)\n\nFile v1.4.1:SKILL.md\n\n---\nname: majia-huiyuan\ndescription: \"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。\"\nlicense: MIT\nmetadata:\n  version: \"1.4.1\"\n  author: \"超级马甲 / maojiebc\"\n  homepage: https://github.com/maojiebc/majia-huiyuan\n  openclaw:\n    emoji: \"🪪\"\n    homepage: https://github.com/maojiebc/majia-huiyuan\n---\n\n# 会员运营 · 马甲实战版\n\n你装上的是一套**开源会员运营家底**：一个可审计、可改造的连锁会员数据中台样板间 + 一座口径公式库 + 一份方法论实录。你的角色是**会员数据顾问**——用户大概率是业务或数据分析背景，不是工程师：先人话，后术语；每个结论给出处路径。SQL 是待验证参考实现，不能承诺“换表名即可生产”。\n\n## 功能架构\n\n一图看全：三大资产 → 五层数仓 → 会员数据顾问能干的十类活。\n\n![majia-huiyuan 功能架构](https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png)\n\n## 三大资产（都在本 skill 目录内）\n\n| 资产 | 位置 | 是什么 |\n|---|---|---|\n| **样板间** | `数据集/` `ETL/` `看板/` `清单/` | 咖啡连锁模拟中台：55 个逻辑数据集（DIM10/DWD16/DWS16/ADS8/DQC1/param4）、25 条 ETL、12 张角色看板。校正逻辑以 `ETL/逻辑SQL/` + `ETL/公共口径/` + `看板/页面文档/` 为准；原始 JSON 与页面 JSON 仅是 v1.4.0 workshop 历史快照 |\n| **公式库** | `公式库/` | 10 册约 3100 行，蒸馏自真实履职（已脱敏）：复购 / RFM（按最近来没来、来得勤不勤、花得多不多分层）/ 核销 / 留存流失的标准 SQL、通用字段词典、数据质量三态坑、DWD 宽表范式、39 生产 ETL 索引、任务与触达回收模型。总入口 `公式库/README.md`（路由表 + 5 条最易踩的坑） |\n| **方法论实录** | `分享/区域运营的一天/README.md` | 获奖直播书面实录（34 页插画）：区域运营痛点 → AI 跑五步人拍板 → 可信四件套 → 三案例（归因到人 / 会闭嘴 / 会多看一眼）→ 四类人落地 FAQ |\n\n## 任务路由（用户要 X → 你做 Y）\n\n| 用户要什么 | 你怎么干 |\n|---|---|\n| **问口径 / 公式**（\"复购怎么算\"\"RFM 怎么分层\"\"核销率口径\"） | 先查 `公式库/README.md` 路由表进对应分册拿标准 SQL；再对照 `ETL/逻辑SQL/` 里样板间的实际实现，两处一致时置信度最高。**必须提口径选项**（如复购跨天 vs 非跨天是两条曲线）。注意 RFM 有两套并存口径：公式库 02 册是高低二分 8 类（快速起步），样板间 ETL 是 5 分制 9 类（精细运营）——先问用户场景再选，不要混用 |\n| **业务动作要数据依据**（\"做一次流失召回\"\"新客怎么促二单\"\"外卖客怎么拉到店\"\"任务怎么派给导购\"） | 按\"圈谁 → 何时 → 力度 → 派给谁 → 怎么回收\"五件套作答：圈选条件出自 `dws_会员生命周期`（7 阶段状态机）/ `dws_会员RFM分层` / `dws_渠道迁移分析`（近 30 天 vs 前 60 天堂食外卖迁移）；时机与力度阈值出自 `公式库/02` 的 R 阈值分级决策表（14/21/30/60 天四档对应不同券力度）+ `param_` 参数表；分派与回收模型出自 `公式库/10-task-and-touch-recovery.md`（任务池 NBA 模型）。**执行内容（话术/素材/社群 SOP）切 majia-siyu，明确告知用户** |\n| **搭 CDP / 标签体系 / 身份打通** | OneID 样板 = `dim_会员身份桥`（手机号 Hash / OpenID / UnionID / 企微外部联系人 / 支付渠道五类身份 + 匹配置信度 + 匹配方式）；身份合并优先级 SQL 在 `公式库/02` 开篇\"顾客标识统一化\"；标签规则外置范式 = `param_` 参数表模式（阈值不硬编码进 SQL）；Profile+Events 双层 = `dim_会员主档` + 六张 `dwd_` 事件表 |\n| **从零设计会员数据体系** | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 分阶段给**最小可用集**：先档案（会员主档/门店主档）+ 订单流水，再算汇总（RFM/生命周期），再上报表。绝不一次吐 55 张表 |\n| **诊断现有体系缺什么** | 把 55 个逻辑数据集当 checklist，逐层对照用户已有的表，输出缺口清单 + 补齐优先级（优先补影响口径的 DIM 和 param） |\n| **生成建表语句** | 用 `数据集/数据样本/*.csv` 表头 + `数据集/结构定义/*.md` 的类型信息推 schema，翻译成用户的目标引擎方言（源是 Spark 3.4，MySQL/ClickHouse/PG 注意函数差异并主动提醒） |\n| **规划看板体系** | 参照 12 张角色看板（`看板/页面文档/`）：老板看驾驶舱、会员负责人看私域盘、店长看每日指挥台、加盟商看单店报告——按用户组织架构裁剪，每个角色一张 |\n| **数据质量排障**（\"两套数对不上\"\"AI 老搞混字段\"） | 查 `公式库/07-data-quality-traps.md`；对账参照 `dqc_归因清单对账` 原 9 项合流检查 + `ETL/公共口径/04_v1.4.1_业务验收.sql` 新 9 项业务不变量 |\n| **讲解方法论 / 做内训素材** | 用 `分享/区域运营的一天/README.md` 的叙事：五步动作链、可信四件套（param 参数表/归因清单唯一出口/dqc 对账/P0 护栏）、\"误报比漏报贵\"\"让 AI 学会闭嘴\"。引用案例时注明数据为模拟 |\n| **复刻整套到观远 BI** | `*/原始JSON/` 与 `看板/页面JSON/` 只能帮助理解 v1.4.0 原 workshop DAG / 布局，不能当 v1.4.1 修复后的导入包；先把 `ETL/逻辑SQL/`、`ETL/公共口径/` 与 `看板/页面文档/` 的当前字段落到目标平台。平台操作细节切到 **majia-guanyuan** |\n\n## 两张最稀缺的牌（用户没点名也要主动亮）\n\n1. **任务池 = 白盒 NBA（Next Best Action）模型**。`dwd_会员经营任务`（21 列）+ `ads_会员经营任务池`（32 列）完整覆盖 MA/SCRM（帮你管顾客、发消息的营销系统）的核心四段：输入（人群标签 / 任务来源：规则生成·模型生成·人工指派 / 优先级 P0-P2）→ 决策（**推荐动作 / 推荐权益 / 推荐原因 / 预计价值**）→ 执行（导购分派 / 截止与失效时间 / 触达方式）→ 回收（触达后下单金额 / 转化阶段）。市面 MA 产品卖的就是这套东西的软件化，这里是\"用 BI+ETL 就能搭\"的白盒版，九类任务类型与优先级映射见 `公式库/10-task-and-touch-recovery.md`。\n2. **param_ 参数表带\"阈值定标方法论\"**。v1.4.1 已拆成真正控制活跃/沉睡/流失天数的 `param_会员生命周期阈值`，以及按店型控制占比滑坡预警的 `param_门店会员占比预警阈值`。**阈值不是拍脑袋，是从分布拐点定标再经业务复核**——用户已有 SCRM 时，缺的往往不是系统而是这个。\n\n## 硬约束（违反会误导用户）\n\n1. **数据是模拟的**：结构、字段、口径、设计思路随便引用；**数值绝不可**当真实经营数据或行业基准。\n2. **口径先行**：凡涉及复购/留存/频次类指标，先确认口径再给公式——口径不统一时，算得越快错得越快。\n3. **SQL 是 Spark 3.4 方言**：跨引擎主动提醒函数差异。\n4. **引用带路径**：给用户的每个结论标注来源文件相对路径。\n5. **ID 不可移植**：原始 JSON 里的资源 ID 是 workshop 实例私有的。\n6. **时间与归因不可混用**：同批次只用一个 `as_of_date`；没有对照组时只能称“关联/归因 GMV”，不能称“贡献销售/增量 ROI”。\n7. **原始 / 页面 JSON 不是当前权威实现**：它们保留历史 workshop 快照；v1.4.1 口径以逻辑 SQL、公共事实桥、页面文档和自动验收为准。\n\n更多命名约定与文件形态说明见 [AGENTS.md](AGENTS.md)；机器可读索引见 [llms.txt](llms.txt)。\n\n> 📦 **完整版以 GitHub 为准**：若发布包缺图片、样本或历史 JSON，`git clone https://github.com/maojiebc/majia-huiyuan` 取完整版；历史 JSON 只用于审计原 DAG，不代表 v1.4.1 校正逻辑。\n\n## 与兄弟 skill 的分工\n\n- **majia-huiyuan（本 skill）**：会员运营的数据与公式——体系怎么设计、口径怎么算、看板给谁看，以及**每个运营动作的数据依据**（圈谁 / 何时 / 力度 / 派给谁 / 怎么回收）。**平台无关。**\n- **[majia-siyu](https://github.com/maojiebc/majia-siyu-team)**：私域经营动作的**执行内容**——朋友圈、群发、欢迎语、社群触达、企微操作和整盘经营诊断。同一个动作两半分工：数据依据在本 skill，话术素材在 siyu；用户从任一侧进来，都告知另一半在哪。\n- **[majia-guanyuan](https://github.com/maojiebc/majia-guanyuan)**：观远 BI 平台的工具与踩坑——ETL 治理、报错手册、自定义图表注入、发布状态机。用户在观远平台上动手时切过去。\n\n**界外不接**（说明白再送走）：付费广告投放的回流模型与 ROI 归因（曝光/点击/消耗不在库内，本库只管投放前的人群圈选）；秒级实时触发（本库是 T+1 批处理快照，实时 MA 是系统的活）；触达通道的 API 对接执行。\n\n## 📋 版本记录\n\n- **v1.4.1**（2026-08-09）业务正确性修复：三条订单事实桥唯一归因；统一 `as_of_date` 与 SCD2；重写留存、利润骨架、连续亏损、回本、零订单日、投诉-only；拆分误名参数；新增 9 项业务不变量回归、GitHub Actions 与构建漂移检查；取消“换表名即可生产”承诺。\n- **v1.4.0**（2026-08-07）能力边界深挖：新增\"业务动作的数据依据\"与\"CDP/标签体系\"两类活（八类活→十类活）；公式库新增第 10 册《任务与触达回收》（NBA 任务池模型 + 差评客户挽回）；触发词补 CDP/分群/圈选/OneID/召回/提频/防流失；与 majia-siyu 的边界从互斥改为\"同一动作两半\"协同；亮明两张王牌（白盒 NBA 模型 + param 阈值定标方法论）与三条界外。\n- **v1.3.2**（2026-07-28）触发边界修复：聚焦会员数据、指标、SQL、数仓与看板；私域内容、触达和经营动作明确交给 majia-siyu。\n- **v1.3.1**（2026-07-23）文档装修：功能架构图 + README.en.md + 品牌后缀落地，内容零改动。\n\n完整历史见 [GitHub Releases](https://github.com/maojiebc/majia-huiyuan/releases)。\n\nFile v1.4.1:ETL/公共口径/README.md\n\n# v1.4.1 公共事实桥\n\n这里放 25 条示范 ETL 共用的三条事实桥，作为归因口径的规范源。为让单条逻辑文档可独立阅读，当前核心 ETL 仍内嵌了等价实现，并由自动测试约束窗口、有效性和唯一性保持一致；生产落地时应先物化事实桥，再让下游直接引用，避免长期维护多份归因 SQL。\n\n| 事实桥 | 输入 | 唯一性 | 用途 |\n|---|---|---|---|\n| `01_触达订单归因桥.sql` | 会员触达 + 已完成订单 | 每个订单最多命中一次最近有效触达 | 私域漏斗、高层驾驶舱、触达后关联销售 |\n| `02_券实例核销订单桥.sql` | 券实例事件 + 已完成订单 | 每个订单最多命中一个实际核销券实例 | 核销订单 GMV、优惠成本 |\n| `03_活动参与订单归因桥.sql` | 活动参与 + 已完成订单 | 每个订单最多命中一次最近有效活动参与 | 活动参与后归因 GMV |\n\n共同约束：\n\n1. 所有输入事实日期不得晚于同一个 `as_of_date`。\n2. 归因只能发生在事件之后；默认滚动窗口为事件时间（含）至事件时间加 8×24 小时（不含），标记为 0–7 天，可由调度参数替换。\n3. 使用 `ROW_NUMBER() OVER (PARTITION BY 订单ID ...) = 1` 强制订单级唯一性。\n4. 下游一律按订单发生日期汇总，不能把未来七天订单塞回触达日或参与日。\n5. 这些桥只证明“时间窗口内关联”，不证明增量。没有随机对照或合格准实验时，只能叫“关联 GMV / 归因 GMV”，不能叫“贡献销售 / 增量 ROI”。\n6. 券实例只有在核销日期落在发放日至失效日内、且不晚于 `as_of_date` 时才是有效核销；异常多券同单时按优惠金额降序、券 ID 升序只保留一张券承接订单 GMV。\n\nSQL 为 Spark 3.4 方言。文件中的 `DATE '2026-06-24'` 是本模拟快照的默认值，生产调度必须替换为同一批次的运行参数。\n\nFile v1.4.1:README.md\n\n# majia-huiyuan · 会员运营家底（开源样板间）\n\n[![Skill Version](https://img.shields.io/badge/skill-v1.4.1-blue)](./SKILL.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n[![skills.sh](https://skills.sh/b/maojiebc/majia-huiyuan)](https://skills.sh/maojiebc/majia-huiyuan)\n[![Release](https://img.shields.io/github/v/release/maojiebc/majia-huiyuan?label=release&color=success)](https://github.com/maojiebc/majia-huiyuan/releases)\n[![Quality](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml/badge.svg)](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml)\n[![AI Agent Friendly](https://img.shields.io/badge/AI_Agent-friendly-1abc9c)](./AGENTS.md)\n[![Data](https://img.shields.io/badge/%E6%95%B0%E6%8D%AE-%E5%85%A8%E6%A8%A1%E6%8B%9F%E7%94%9F%E6%88%90-orange)](#数据说明必读)\n\n> **会员运营 · 马甲实战版** — 一套**完整、可审计、可改造的**连锁会员数据参考体系。以一家虚构的咖啡连锁为例，从会员注册的第一行数据，到老板看的经营驾驶舱：**55 个逻辑数据集、25 条数据加工链、12 张看板，外加约 3100 行的实战公式库**，全部摊开。\n>\n> 数据全部模拟生成，与任何真实企业无关。MIT 协议，个人用、公司用、商用，都随便。\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png\" width=\"440\" alt=\"majia-huiyuan v1.4.1 功能架构：三大资产 + 五层数仓 + 会员数据顾问十类活 + 与 majia-siyu（执行内容）及 majia-guanyuan（平台工具）的分工\"/>\n</p>\n\n**谁适合看**：做会员、做私域的业务同学；做数据分析、数据建设的同学；想给自己公司从零搭一套会员数据体系的人。**不需要会写代码。**\n\n**AI 也适合看**：如果你是 AI Agent（WorkBuddy / Claude / Codex / Cursor …），你的入口在 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md)；本仓库同时是一个可安装的 **Agent Skill**（[SKILL.md](./SKILL.md)），装法见[下方](#-当-agent-skill-用)。\n\n---\n\n**你是谁，直接去哪里：**\n\n| 我想做的事 | 直接去 |\n|---|---|\n| 找某个指标怎么算（复购率、RFM、核销率…） | [公式库/README.md](./公式库/README.md) → 按主题找分册 |\n| 看表结构 / 字段定义 / 数据长什么样 | [数据集/结构定义/](./数据集/结构定义/) + [数据集/数据样本/](./数据集/数据样本/) |\n| 理解某条 ETL 的加工逻辑和 SQL 口径 | [ETL/逻辑SQL/](./ETL/逻辑SQL/) 按表名找对应 md |\n| 搭观远 BI，理解原 workshop DAG / 布局 | [ETL/原始JSON/](./ETL/原始JSON/) + [数据集/原始JSON/](./数据集/原始JSON/) + [看板/页面JSON/](./看板/页面JSON/)（均为历史快照，不含 v1.4.1 字段修复；资源 ID 也不可移植） |\n| 用 AI 工具直接问会员数据问题 | [SKILL.md](./SKILL.md) 装成 Agent Skill，或把仓库地址扔给 AI |\n| 先看故事再翻表 | [分享/区域运营的一天/](./分享/区域运营的一天/README.md) |\n\n> **v1.4.1 可信边界：**`ETL/逻辑SQL/`、[`ETL/公共口径/`](./ETL/公共口径/) 与 `看板/页面文档/` 是当前校正后的参考口径；仍需用自家数据验证后再生产化。`*/原始JSON/` 和 `看板/页面JSON/` 是 2026-06-24 的 workshop 历史快照，保留用于审计原 DAG / 布局，**未同步改造成 v1.4.1 可直接导入包**，其中仍可能出现旧字段名。当前 SQL 定位是“待验证示例”，不是标准答案。\n\n---\n\n## 这是什么\n\n会员运营这行有块三不管地带：字段怎么定义、口径怎么算、看板怎么搭，做业务的嫌它是技术细节，做数据的嫌它是业务琐事，两边都懂的人当它是吃饭本事。结果就是，想学的人找不到一份能从头看到尾的完整参照。\n\n这个仓库就是那份参照——一个\"样板间\"。\n\n它是 2026 年 5 月在观远 BI 官方 workshop 实例上独立搭建的一套完整会员数据中台，虚构了一家咖啡连锁：**8 万会员、1200 家门店、141 个加盟商、74 个商品、129 万笔订单**。麻雀不大，五脏俱全：会员注册、订单、发券、积分、私域触达、投诉评价、加盟分账、门店成本，全链路的数据都有，而且是打通的。\n\n毛坯房教不会人装修，样板间可以。你不一定照单全收，但每面墙长什么样、水电怎么走，这里都看得见。\n\n本仓库会持续迭代，路线图见[下方](#路线图)。\n\n## 三分钟看懂：数据分五层\n\n所有数据集按五层组织（这是数据行业的通用做法，名字唬人，事情简单）：\n\n| 层 | 行话 | 人话 | 本库数量 |\n|---|---|---|---|\n| **DIM** | 维度层 | **档案柜**：会员档案、门店档案、商品档案，一行 = 一个人 / 一家店 / 一件商品 | 10 |\n| **DWD** | 明细层 | **流水账**：每笔订单、每次发券、每条评价，一行 = 发生过的一件事 | 16 |\n| **DWS** | 汇总层 | **台账**：把流水按人、按店、按月归拢，复购率、RFM 分层都在这层算出来 | 16 |\n| **ADS** | 应用层 | **驾驶舱**：老板、店长、运营直接看的最终报表 | 8 |\n| **DQC** | 质检层 | **质检员**：两套数对不上时，先来这层查 | 1 |\n| param | 参数表 | 阈值配置（比如\"几天没来算流失\"，写在表里而不是写死在公式里） | 4 |\n\n数据的流向一句话：**档案柜 + 流水账 →（25 条加工链）→ 台账 → 驾驶舱**。\n\n## 资产地图（55 个逻辑数据集）\n\n每个数据集一句人话。字段级明细看 [数据集/结构定义/](./数据集/结构定义/)，长什么样看 [数据集/数据样本/](./数据集/数据样本/)。\n\n### DIM 档案柜（10）\n\n| 数据集 | 一句话 |\n|---|---|\n| dim_会员主档 | 每个会员一行：等级、注册渠道、城市、状态（8 万行） |\n| dim_会员身份桥 | 一个人的多个身份（手机号 / 微信 / 支付宝）怎么认成同一个人 |\n| dim_门店主档 | 每家店一行：城市、店型、开业日期（1200 家） |\n| dim_加盟商主档 | 每个加盟商一行（141 个） |\n| dim_商品主档 | 每个商品一行：品类、价格带（74 个） |\n| dim_券模板 | 每种券一行：面额、门槛、有效期 |\n| dim_活动主档 | 每场营销活动一行 |\n| dim_员工导购 | 每个店员 / 导购一行 |\n| dim_成本科目 | 房租、人力、原料……成本怎么分类 |\n| dim_日期 | 日期维表：节假日、周末、月份归属 |\n\n### DWD 流水账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dwd_订单 | 每笔订单一行：金额、渠道、是否会员、是否用券（129 万行） |\n| dwd_订单商品 | 订单里的每件商品一行 |\n| dwd_会员注册绑定 | 每次注册 / 绑定一行 |\n| dwd_券事件 | 每张券的发放、核销、过期 |\n| dwd_积分事件 | 每笔积分的挣与花 |\n| dwd_会员触达 | 每次触达一行：短信 / 企微 / Push，发给谁、谁打开（50 万行） |\n| dwd_私域事件 | 进群、退群、加好友、会话 |\n| dwd_活动参与 | 谁参加了哪场活动 |\n| dwd_评价 | 每条顾客评价 |\n| dwd_投诉 | 每条投诉 |\n| dwd_会员经营任务 | 总部派给门店的会员任务及完成情况 |\n| dwd_加盟合同明细 | 每份加盟合同 |\n| dwd_加盟分账明细 | 每笔加盟分账 |\n| dwd_门店成本明细 | 每笔门店成本 |\n| dwd_门店投资明细 | 每笔开店投资 |\n| dwd_门店目标 | 每店每期的目标值 |\n\n### DWS 台账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dws_会员RFM分层 | 每个会员的 R / F / M 打分和分层标签（做精准营销的底座） |\n| dws_会员生命周期 | 新客 / 活跃 / 沉睡 / 流失，每人当前在哪一段 |\n| dws_会员同期群留存 | 按注册月份分组，看每批人第 N 月还剩多少（Cohort 留存） |\n| dws_私域转化漏斗 | 触达 → 查看 → 下单，每场活动的漏斗和转化率 |\n| dws_券效益分析 | 每种券核销了多少、对应订单 GMV 多少；无对照时不报增量 ROI |\n| dws_渠道迁移分析 | 顾客在堂食 / 外卖 / 小程序之间怎么流动 |\n| dws_商品销售分析 | 每个商品卖得怎么样 |\n| dws_门店日报 | 每店每天的核心经营数 |\n| dws_目标达成 | 每店目标完成进度 |\n| dws_新店爬坡_Comp老店 | 新店爬坡曲线，和可比老店（Comp）对照 |\n| dws_单店利润月汇总 | 每店每月的利润账 |\n| dws_成本结构汇总 | 成本按科目的构成 |\n| dws_加盟商经营汇总 | 每个加盟商名下门店的经营汇总 |\n| dws_加盟回本测算 | 每家加盟店投了多少、回了多少、预计几个月回本、风险等级 |\n| dws_员工导购效能 | 每个导购拉新、复购带动的效能 |\n| dws_体验口碑汇总 | 评价、投诉汇总成门店体验分 |\n\n### ADS 驾驶舱（8）\n\n| 数据集 | 一句话 |\n|---|---|\n| ads_高层经营驾驶舱 | 给老板：大盘营收、会员销售、触达后关联销售与风险信号 |\n| ads_会员私域驾驶舱 | 给会员负责人：活跃、新增、触达、会员销售占比 |\n| ads_会员经营任务池 | 给运营：待办的会员经营任务清单 |\n| ads_门店每日指挥台 | 给店长：今天该看的数、该做的事 |\n| ads_活动权益复盘 | 给营销：每场活动的核销、触达后关联与增量测算状态 |\n| ads_单店利润健康 | 给财务 / 拓展：每店利润健康度 |\n| ads_加盟商单店报告 | 给加盟商：他自己店的经营报告 |\n| ads_异常归因清单 | 数据异动的归因线索清单 |\n\n### DQC 质检 + param 参数（5）\n\n| 数据集 | 一句话 |\n|---|---|\n| dqc_归因清单对账 | 两条链路算同一个数，对不上就报警 |\n| param_会员生命周期阈值 | 几天算沉睡、几天算流失，阈值配置 |\n| param_门店会员占比预警阈值 | 不同门店类型的会员订单占比月度下降预警线 |\n| param_利润健康阈值 | 利润健康度的分档线 |\n| param_豁免日历 | 大促 / 特殊日期豁免名单（防止误判异常） |\n\n> **复刻这套体系，先填这四张表。**\n> `param_` 参数表是整套 ETL 的阈值配置中心：哪些日期算豁免不报警、多少天不来算沉睡、会员占比下降多少报警、利润率多少算健康，都写在这里——而不是硬编码进公式。v1.4.1 已把原先误名的生命周期参数拆成真正的 `param_会员生命周期阈值` 与 `param_门店会员占比预警阈值`。\n\n## 12 张看板\n\n从老板到店长到加盟商，每个角色一张自己的报表。清单见 [清单/看板清单.csv](./清单/看板清单.csv)，每张的卡片明细在 [看板/页面文档/](./看板/页面文档/)。\n\n01 高层经营驾驶舱 · 02 会员私域驾驶舱 · 03 会员经营任务池 · 04 门店每日指挥台 · 05 活动权益复盘 · 06 体验风险专题 · 07 单店利润健康 · 08 加盟商单店报告 · 09 总览（ECharts 重构版）· 10 异常归因作战页 · 外卖业绩近 30 天 GMV（卖了多少钱）· 参赛作品提交页\n\n## 公式库（60+ 段可复用、上线前须验证的 SQL）\n\n样板间给你看结构，公式库提供算法参考。[公式库/](./公式库/) 蒸馏自两段连锁餐饮 BI 实战履职（已全脱敏，约 3100 行），2026-07-12 从 majia-guanyuan 迁入本仓库统一维护，按主题分 10 册：\n\n| 分册 | 管什么 |\n|---|---|\n| [01 日期与时间](./公式库/01-date-and-time.md) | T-1、本月、近 N 天、用餐时段、跨月对齐、观远时间宏 |\n| [02 顾客与会员](./公式库/02-customer-and-membership.md) | 新老客、消费频次 3 口径、复购（跨天 vs 非跨天）、RFM 8 类 × 营销策略、留存流失 |\n| [03 营收 KPI](./公式库/03-revenue-kpi.md) | 客单价 AC、ADS、ADT、Comp 同店、会员贡献占比 |\n| [04 渠道与门店](./公式库/04-channel-and-store.md) | 堂食外卖分流、门店生命周期、多渠道评价 pipeline |\n| [05 券与折扣](./公式库/05-coupon-and-discount.md) | 核销率、折扣率、折扣分桶、注册首张券 |\n| [06 SQL 工具箱](./公式库/06-sql-utils.md) | 字符串拆解、开窗排名、累计窗口 |\n| [07 数据质量坑](./公式库/07-data-quality-traps.md) | NULL / 空串 / 'null' 三态、口径歧义、通用字段词典 |\n| [08 ETL 工程范式](./公式库/08-etl-engineering-patterns.md) | DWD 宽表底座、财务双源对账、POS 归一化、Cohort 网格 |\n| [09 生产 ETL 索引](./公式库/09-etl-catalog.md) | 39 个生产 ETL 按 11 个业务域的索引与复用决策表 |\n| [10 任务与触达回收](./公式库/10-task-and-touch-recovery.md) | 白盒 NBA 任务池模型、九类任务×圈选依据、防打扰与仲裁、漏斗四率回收、差评客户挽回 |\n\n总入口和\"5 条最容易踩的坑\"见 [公式库/README.md](./公式库/README.md)。**样板间的表结构 + 公式库的算法，两样凑齐，是方案评审和二次开发的图纸；生产上线还要完成字段映射、口径确认和回归验收。**\n\n## 一场直播，把这套东西讲了一遍\n\n2026 年 7 月，这套体系的设计思路在观远「对话 AI Hero」直播里完整讲过一次（AI 创新赛一等奖作品《区域运营的一天》）：区域运营一上午的巡店分析，AI 怎么压缩到几分钟，怎么归因到人、怎么学会闭嘴、怎么多看一眼。\n\n**[📖 分享/区域运营的一天/](./分享/区域运营的一天/README.md)** —— 34 页插画板全嵌的书面实录，当时演示的数据环境就是本仓库。想先看故事再翻表的，从这里进。\n\n## 目录结构（怎么翻）\n\n```\n清单/          三张总清单 CSV（数据集 / ETL / 看板，含 ID）——先看这里拿全景\n公式库/        餐饮 BI 公式实战库（README + 10 册）★ 算法和口径 SQL 都在这\n分享/          直播分享书面实录（34 页插画长文）★ 想先看故事的从这进\n数据集/\n  结构定义/    每个数据集的字段结构说明 ★ 最值得先看\n  数据样本/    每表最多 200 行模拟样本 CSV（小表按实际规模），表头即当前 schema\n  原始JSON/    观远平台 v1.4.0 历史快照（审计用）\nETL/\n  逻辑SQL/     25 条加工链的节点结构和 SQL 逻辑 ★ 口径都在这\n  公共口径/    v1.4.1 三条事实桥 + 业务不变量验收 SQL ★ 多链共用的正确性底座\n  原始JSON/    v1.4.0 workshop 历史快照（不是 v1.4.1 可导入包）\n看板/\n  页面文档/    v1.4.1 校正后的卡片字段清单\n  页面JSON/    v1.4.0 页面布局历史快照（旧字段，不可直接导入）\nskillhub/      ⚙️ 自动生成产物（ClawHub / npm 发布包的瘦身文本子集）\n               勿手动修改——改根目录再跑 python3 tools/build_skillhub_bundle.py\ntools/         构建脚本（含 --check 漂移检测模式）\n```\n\n## 三种用法\n\n**① 业务同学：对照自查。** 打开 [数据集/数据样本/dws_会员RFM分层.csv](./数据集/数据样本/)，你嘴里的\"复购\"\"流失\"\"分层\"在数据里就长这样。拿 [清单/数据集清单.csv](./清单/数据集清单.csv) 当清单，对照你公司现在的会员体系，缺哪层、缺哪几张表，一眼看得出来。\n\n**② 数据同学：改造字段和口径。** [结构定义](./数据集/结构定义/)里有全部字段，[逻辑SQL](./ETL/逻辑SQL/) 与 [公共口径](./ETL/公共口径/) 里有加工口径，[公式库](./公式库/) 里有复购 / RFM（按最近来没来、来得勤不勤、花得多不多给顾客分层）/ 核销等算法。先完成自家字段映射、边界条件和小样本回放，再进入生产。SQL 方言是 Spark 3.4。\n\n**③ 参考复刻。** 用观远 BI 的话，`原始JSON` 可帮助理解原 workshop 的节点 DAG，但它仍是 v1.4.0 历史快照；请先把 v1.4.1 的校正逻辑重新落到目标平台再运行。不用观远也没关系，五层结构和字段设计仍可作为跨平台架构样板。\n\n## 让 AI 替你干活（推荐）\n\n这个库特意做成了 AI Agent 友好的。把仓库地址扔给你的 AI 工具（WorkBuddy / Claude Code / Codex / Cursor……），直接说人话：\n\n- \"对照这个库，看看我们公司的会员数据还缺什么\"\n- \"把 dws_会员RFM分层 的口径翻译成我们数仓的建表语句\"\n- \"照这套结构，给我出一版我们品牌的会员看板规划\"\n\nAI 会自己顺着 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md) 找到路，不用你解释仓库结构。\n\n## 🎛 当 Agent Skill 用\n\n本仓库同时是一个 **Agent Skill**（[SKILL.md](./SKILL.md) 在仓库根部）——装进任何支持 SKILL.md 的 agent（Claude Code / OpenClaw / Codex / WorkBuddy …），它就变成一个随叫随到的**会员数据顾问**，能干十类活：口径与公式咨询、**会员运营动作的数据依据**（召回/提频/防流失该圈谁、何时触达、给什么力度、派给谁、怎么回收）、**CDP 与标签体系设计**（OneID 身份打通、人群圈选、标签规则外置）、从零设计会员数据体系、现有体系缺口诊断、生成建表 DDL、按角色规划看板、数据质量排障、方法论内训、观远整套复刻。\n\n```bash\n# ClawHub / OpenClaw\nclawhub install majia-huiyuan\nopenclaw skills install majia-huiyuan\n\n# GitHub CLI（gh 2.90+）\ngh skill install maojiebc/majia-huiyuan majia-huiyuan --agent claude-code --scope user\n\n# 手动 clone 到对应 agent 的 skills 目录\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.claude/skills/majia-huiyuan   # Claude Code\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.codex/skills/majia-huiyuan    # Codex\n```\n\n装完试一句：\"帮我看看我们公司的会员数据体系缺什么\"，或者\"复购率的口径给我几种标准算法\"。\n\n## 数据说明（必读）\n\n- **全部数据由程序模拟生成**，与任何真实企业无关；手机号等个人标识列已打码（形如 `156****0925`）\n- 仓库内每表附模拟样本，明细大表最多 200 行、参数和小表按实际样例规模；完整规模（如会员 8 万、订单 129 万）标在各表的结构定义里\n- JSON 里的资源 ID 是 workshop 实例私有的，复刻时会生成你自己的\n- 快照时间 2026-06-24，导出工具为观远官方 `guancli`；统一运行参数 `as_of_date` 也默认使用该日\n- `原始JSON` 与 `看板/页面JSON` 保留的是历史平台快照；v1.4.1 的修复以 `ETL/逻辑SQL`、`ETL/公共口径`、`看板/页面文档` 和自动验收为准\n- 结构定义若同时保留平台历史字段，会在文件顶部标出 `v1.4.1 结构覆盖`；当前 CSV 样本表头已按该覆盖口径同步，不能用下方明确标注的 v1.4.0 历史字段反推新表\n\n## 兄弟项目\n\n| 项目 | 关系 |\n|---|---|\n| [majia-siyu](https://github.com/maojiebc/majia-siyu-team) | 私域经营动作入口。**朋友圈、群发、欢迎语、社群触达与整盘经营诊断在那边；指标、公式、SQL 与看板在本库。** |\n| [majia-guanyuan](https://github.com/maojiebc/majia-guanyuan) | 观远 BI 实战增益层 skill。**工具与踩坑手册在那边，数据与公式在这边**；本库的模拟中台和公式库都源自它，现独立迭代 |\n\n## 路线图\n\n- [ ] **口径卡片**：每张核心表配一页\"这张表回答什么业务问题\"\n- [ ] **通用建表 DDL**：不用观远也能一键建表的 SQL 版本\n- [ ] **实战问题包**：常见会员运营问题 → 用哪几张表、怎么查（脱敏后的真实场景）\n- [ ] **行业变体**：茶饮 / 正餐 / 零售的差异字段说明\n- [ ] 字段词典中英对照\n\n想看哪个先做，[提个 issue](https://github.com/maojiebc/majia-huiyuan/issues) 投票。\n\n## 📋 版本记录\n\n**最新：V1.4.1** (2026-08-09) — **业务正确性修复**：重做触达、券实例、活动参与三条订单事实桥；统一 `as_of_date` 和 SCD2 时间关联；修复同期群留存、零销售成本月、连续亏损、加盟回本、零订单日和投诉-only 日期；拆分误名参数表；新增 9 项业务不变量回归测试、GitHub Actions 与发布包漂移检查。SQL 对外定位从“可直接复制”调整为“待验证示例”。\n\n**V1.4.0** (2026-08-07) — **能力边界深挖**：SKILL.md 十类活（新增\"业务动作的数据依据\"与\"CDP/标签体系\"两类）；公式库新增第 10 册《任务与触达回收》；与 majia-siyu 的边界改为\"同一动作两半\"协同。\n\n**V1.3.2** (2026-07-28) — **触发边界修复**：聚焦会员数据、指标口径、SQL、数仓与看板；私域内容、触达和经营动作明确交给 `majia-siyu`。\n\n**V1.3.1** (2026-07-23) — **文档装修**：新增功能架构图（`docs/architecture.svg` + PNG，三大资产 / 五层数仓 / 八类活一图看全）、README.en.md 英文版、品牌后缀「· 马甲实战版」pixel-perfect 落到各展示面。内容零改动。\n\n完整历史见 [GitHub Releases](https://github.com/maojiebc/majia-huiyuan/releases)。\n\n## FAQ\n\n**是真实数据吗？** 不是，全部模拟生成，放心引用结构、不要引用数值。\n**能商用吗？** MIT 协议，能，注明出处就行。\n**我不用观远 BI，这库对我有用吗？** 有。五层结构、55 张逻辑表的字段设计和 25 条链的参考口径都可跨平台评审；具体 SQL 仍要按引擎和自家数据验证。\n**发现错误 / 想要新内容？** [提 issue](https://github.com/maojiebc/majia-huiyuan/issues)。你提一条，这套东西就厚一点。\n\n## 👤 作者 / 联系\n\n**马甲（@maojiebc）** · 超级马甲 · 14 年用户运营，连锁餐饮\"数据与运营之间的翻译官\"\n\n| 渠道 | 链接 |\n|---|---|\n| 📧 Email | [m9224@163.com](mailto:m9224@163.com) |\n| 🐙 GitHub | [github.com/maojiebc](https://github.com/maojiebc) |\n| 🐦 X | [@maojiebc](https://x.com/maojiebc) |\n| 📕 小红书 | [超级马甲](https://xhslink.com/m/4fQMJeHHWKC) |\n| 📰 微信公众号 | [超级马甲](https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzY5NzIzODk2NA==#wechat_redirect) |\n\n> 踩过的坑、总结的经验，不叫私有，是群策群力。\n\nFile v1.4.1:公式库/README.md\n\n# 餐饮零售 BI 公式实战库\n\n> 蒸馏自两段连续的餐饮 BI 分析师履职（**餐饮连锁 A + 餐饮连锁 B**，均为多门店连锁餐饮品牌），覆盖**观远 BI / Guandata** 平台上的常用 ETL SQL、卡片表达式、时间宏；第 [10 册](10-task-and-touch-recovery.md)另以本仓库样板间的任务池实现为蓝本。所有品牌名、表名、密集业务字段已去敏，可自由复用。\n\n## 路由表\n\n| 我要算 / 处理 | 去 |\n|---|---|\n| 日期范围（T-1、本月、上月、近 N 天）、用餐时段、时间宏、跨月对齐 | [01-date-and-time.md](01-date-and-time.md) |\n| 新老客 / 会员属性 / 消费频次 / 复购 / 留存 / 流失 / **RFM 8 类 × 营销策略** / R 阈值多档分级 | [02-customer-and-membership.md](02-customer-and-membership.md) |\n| AC / ADS / ADT / AUD / Comp / TC_CRM% / NS_CRM% / 营收占比 | [03-revenue-kpi.md](03-revenue-kpi.md) |\n| 堂食 vs 外卖渠道分流 / 订单子渠道大 case / 门店生命周期 / StoreDate / 成长类型 / **多渠道评价 Pipeline** | [04-channel-and-store.md](04-channel-and-store.md) |\n| 核销率 / 折扣率 / 折扣分桶 / 首张券 / 30 天优惠订单比例 | [05-coupon-and-discount.md](05-coupon-and-discount.md) |\n| `regexp_extract` / `explode-split` / `collect_set-concat_ws` / 开窗排名 / 字段拆解 | [06-sql-utils.md](06-sql-utils.md) |\n| NULL / 空字符串 / 'null' 字面值三态 / 字段口径歧义 / 通用字段词典 | [07-data-quality-traps.md](07-data-quality-traps.md) |\n| **ETL 工程范式**（10-CTE DWD 宽表 / 轻节点重 SQL vs 重节点轻 SQL / 财务双源对账 / POS 归一化 / Cohort 网格）| [08-etl-engineering-patterns.md](08-etl-engineering-patterns.md) |\n| **39 个 V1 生产 ETL 索引清单**（按 11 个业务域分类 + 每 ETL 的节点/输入/输出/SQL 节点速查 + 复用决策表）| [09-etl-catalog.md](09-etl-catalog.md) |\n| **任务与触达回收**（白盒 NBA 任务池模型 / 九类任务×优先级×圈选依据 / 任务生成 SQL / 防打扰与仲裁 / 漏斗四率回收 / **差评客户挽回**）| [10-task-and-touch-recovery.md](10-task-and-touch-recovery.md) |\n\n## 通用字段词典\n\nETL 输入表统一称作 `input1`（观远 SmartETL 默认入参名），其余字段命名约定如下。**本库所有 SQL 都使用这套约定，复用时按你方实际字段名重命名即可。**\n\n| 词典名 | 含义 | 等价别名（你可能遇到的） |\n|---|---|---|\n| `订单号` | 订单唯一 ID | `OrderKey` / `order_id` / `券包订单ID` |\n| `订单日期` | 业务日期 | `businessDate` / `report_date` |\n| `下单时间` | 含时分秒的下单时刻 | `OrderTime` / `create_time` |\n| `去税营业额` | 营收口径（剔税） | `去税营业额 NS` / `income_应收` / `NS` |\n| `含税营业额` | 营收口径（含税） | `含税营业额 GS` / `total` / `GS` |\n| `原价金额` | 折扣前金额 | `原价金额 ALA_Sales` / `ALA` / `original_price` |\n| `折扣金额` | 让利金额 | `Discount` |\n| `销量` | 商品件数 | `QTY` |\n| `订单产品` | 商品名字符串 | `Items` / `names` / `names_grill` |\n| `顾客标识` | 跨渠道统一顾客 ID（优先级：会员卡号 > 微信 openid > 支付宝 user_id > 云闪付 user_id） | — |\n| `会员卡号` | 会员 ID | `MemberShipID` / `dis_cardno` / `card_no` |\n| `是否会员` | 二值或三值标记 | `MemberType` / `IsMember` |\n| `门店编号` | 门店唯一 ID | `StoreID` / `store_code` |\n| `门店名称` | 门店中文名 | `store_name` / `SHOP_NAME` |\n| `分公司` | 区域分公司 | `注册所属分公司` / `归属分公司` |\n| `渠道ID` | 数字化渠道码（外卖、堂食、自取等） | `CHANNEL_ID` |\n| `来源类型` | 二级来源（微信/支付宝/拼单/POS 等） | `FromType` / `OrderSource` |\n| `业务渠道` | 一级归类（堂食/外卖） | `Channel` / `业务渠道划分` |\n| `StoreDate` | `CONCAT(门店编号, '_', 营业日期)`，作为门店×日的唯一键 | — |\n| `Comp` 标记 | 是否同店可比 | `IsComp` |\n| `TC` | 客流数 / 订单笔数 | — |\n\n## 5 条最容易踩的坑（TL;DR）\n\n1. **`COUNT(DISTINCT IF(cond, x, NULL))` 才正确，写 `IF(cond, x, 0)` 会把 0 也计数一个。** → 详见 [07](07-data-quality-traps.md#null-vs-0)\n2. **顾客标识三态**：`NULL` / 空字符串 `''` / 字面量 `'null'` 必须**三个都判**，否则统计会漂。 → [07](07-data-quality-traps.md#三态判断)\n3. **`COUNT(订单号)` 和 `COUNT(DISTINCT 订单号)` 不一样**：拼单订单一单多行，分母不去重会重复。 → [03](03-revenue-kpi.md#客单价-ac)\n4. **跨天复购 vs 非跨天复购口径要明示**：`COUNT(DISTINCT 订单日期)>=2` 和 `COUNT(DISTINCT 订单号)>=2` 是两条曲线，不要混用。 → [02](02-customer-and-membership.md#复购口径)\n5. **观远时间宏 `{{{...}}}` 必须三个花括号**，少一个就被当字符串：`{{{yesterday}}}` / `{{{monday last week - 28 days}}}` / `{{{%2025-12-12}}}`。 → [01](01-date-and-time.md#时间宏)\n\n## 编排建议\n\n- **写新 ETL 节点之前**：先看 [01](01-date-and-time.md)（确定时间范围）+ [07](07-data-quality-traps.md)（确定字段三态处理），再去对应业务文件抄公式。\n- **建卡 / 写卡片字段表达式**：直接去 [03](03-revenue-kpi.md) / [05](05-coupon-and-discount.md) 拿对应 KPI。\n- **接到\"为什么这俩数对不上\"的甩锅**：去 [07](07-data-quality-traps.md) 对一遍口径，80% 是 NULL / 重复字段名 / 三态判断不一致。\n- **分层做完要落成运营动作**（召回 / 提频 / 任务派导购）：去 [10](10-task-and-touch-recovery.md) 抄任务池模型和回收口径——分层是弹药，任务池是扳机。\n\n## 来源标记\n\n- 🅰️ = 餐饮连锁 A 实战\n- 🅱️ = 餐饮连锁 B 实战\n- ⚪ = 两家通用 / 行业通用\n- 🏠 = 本仓库样板间实现（模拟数据，结构与口径可引用，数值不可当基准；主要出现在 [10 册](10-task-and-touch-recovery.md)）\n\n格式参考 [02-customer-and-membership.md](02-customer-and-membership.md) 第一段。\n\nFile v1.4.1:分享/区域运营的一天/README.md\n\n# 区域运营的一天 · 直播分享全记录（34 页插画版）\n\n> 2026 年 7 月 9 日，观远数据「对话 AI Hero」第一期直播，我把 AI 创新赛一等奖作品《区域运营的一天》从头到尾讲了一遍，线上 70 多人，讲了一个多小时。这份文档是那场直播的书面整理版：34 页插画板全部嵌入，讲述文字从直播逐字稿蒸馏而来，去掉了口水话，保留了当时真实讲的内容和现场问答。\n>\n> 当时演示用的整套数据环境有 54 个数据集、25 条 ETL、12 张看板；v1.4.1 将误名参数表拆分后，当前仓库为 55 个逻辑数据集——看完这篇，回到 [仓库首页](../../README.md) 就能查看完整模拟中台。\n\n---\n\n## 一、开场：这是一场什么分享\n\n![](images/a1.jpg)\n\n作品叫《区域运营的一天》。一句话：区域运营过去要花一上午干的巡店分析，让 AI 压缩到几分钟——不是做一张更快的报表，是把\"发现问题、分析原因、推动行动\"这条每天必走的动作链整个交给 AI 跑，人只做最后的拍板。\n\n![](images/a2.jpg)\n\n先交代我是谁：我不是数据分析师出身，是业务，在门店堆里泡了十几年的用户运营，做过到家、做过实体零售，现在在连锁餐饮负责会员体系。我自己搭过 BI 看板、导过数据集，但算不上专业人士——正因为不专业，这套东西对我这种人能跑通，对你大概率也能。\n\n![](images/a3.jpg)\n\n路线四站：先讲区域运营的一天有多烦（痛点），再讲 AI 接手之后的一天长什么样（方案），然后回答 AI 凭什么可信（底座），最后当场真跑三个问题（演示）。\n\n![](images/a4.jpg)\n\n直播时我说这不是汇报，是聊天，有疑问随时打断。落到这份文档：读到哪觉得不对，[提个 issue](https://github.com/maojiebc/majia-huiyuan/issues) 就是打断我。\n\n## 二、痛点：一上午是怎么被吃掉的\n\n![](images/b1.jpg)\n\n给主角取了个花名，花十六，区域督导，管几十家店，一年大部分时间在辖区里跑。他每天早上的活：翻三个看板——利润的、口碑的、会员的——找出哪家店红了；发现一家在亏，打电话问店长，店长说\"隔壁店也这样\"；只好拉 Excel 人肉对口径，你说的口径是 A，他理解的是 B。一上午过去，只够看几家店。我们这行还有个背景：BI 权限往往下放不到一线督导，大家实际流转的还是企业微信里的本地 Excel。\n\n![](images/b2.jpg)\n\n我们之前也试过各种智能体、机器人，它们很勤奋，不断弹通知：这个指标跌了、那个数据负增长。但大部分是无效信息。预警一多，等于没有预警。\n\n![](images/b3.jpg)\n\n更要命的是误报比漏报贵。报警信息一旦出错，一线的人第一反应不是\"数据有问题\"，是\"AI 很蠢\"——信任这个东西，错一次，你再想让他给第二次机会，很难。\n\n![](images/b4.jpg)\n\n演示环境 1200 家店里，P0 级严重亏损 103 条，集中在约 30 家门店，连着几个月失血。真正贵的不是亏损本身，是归因延迟：从\"被报警\"到\"搞清为什么、谁去管\"，中间隔着的每一天都是钱。\n\n## 三、方案：AI 跑五步，人拍最后一板\n\n![](images/c1.jpg)\n\n现在花十六只问一句大白话：\"今天哪些店要我管？为什么？谁去管？\"不用把需求翻译成技术语言。顺带说个口径的老梗：顾客一天内下两单算不算复购？隔天下第二单才算？这种口径争议在我们早期吵了很久——大白话提问的前提，是口径已经有人钉死在表里（这正是本仓库[公式库](../../公式库/)管的事）。\n\n![](images/c2.jpg)\n\nAI 替他跑五步：**发现**（运营、利润、口碑、会员四路监控合成一张待办清单）、**归因**（异常出在房租、人工、客群还是口碑，沿数仓下钻排除）、**豁免**（寒暑假的学校店、爬坡期的新店，这些\"不该报的\"自动挡掉）、**派单**（每条异常带责任人、风险等级、建议动作）、**通知**（按区域经理分组生成日报）。\n\n![](images/c3.jpg)\n\n自动化的边界停在\"发送\"之前。日报生成好、推送模板备好，最后由人确认再发出。我试下来，不管多强的模型，最后的判断替代不了人——这也是每个经验丰富的业务、分析师真正的竞争力所在。\n\n## 四、底座：AI 凭什么可信\n\n![](images/d1.jpg)\n\n讲到这里通常会被问：这些判断，AI 凭什么？答案是它不凭感觉，它读的是一套业务看得懂、改得动、可对账的数据资产。\n\n![](images/d2.jpg)\n\n四件套。**参数表**：9 种店型乘 7 个参数的差异化阈值——商场店房租上限 28%、社区店 12%，判断标准从人脑和代码里搬进一张表；**归因清单**：四路异常合流成唯一出口，6115 行，每行带归因、责任人、建议动作，不再是两个地方查出两套结论；**对账自检**：九项检查每次重跑自动重跑，机器查机器；**护栏**：全量 103 条 P0 无一被豁免，\"闭嘴\"绝不闭出漏报。护栏这个思路是通用的——直播前一天我批量生成这些插画，就给流程加了一条\"检查图里中文有没有乱码，有就重生成\"，做数、做图、做文案，都得有收尾那道检查。\n\n![](images/d3.jpg)\n\n给数据打标签、建多维数据集，是老概念，AI 时代反而绕不开：字段有没有注释、有没有歧义，直接决定 AI 读出来的是判断还是猜测。\n\n![](images/d4.jpg)\n\n这套 demo 我是从零建的，但落回真实企业不需要推倒重来——现有 BI 资产全保留，只做增量。不过我想多说一句\"推倒重来的勇气\"：历史数据乱、字段没注释、前辈写的逻辑不敢碰，是每家的常态，我以前改一处报错就吓得回滚。现在 AI 能读全库，我第一次有了底气把 30 多条 ETL 理成十几条、把上千张没人打开的看板砍到几百张——推不推倒是选择，敢不敢推倒是能力。\n\n## 五、工具层：眼睛和手\n\n![](images/e1.jpg)\n\n我一开始以为 CLI 是给人看的说明书，后来才明白：它是给 AI 用的命令行，相当于 AI 的鼠标和界面。大模型是现成的大脑，缺的从来是眼睛和手——CLI 让 AI 看得懂你的数据资产（哪张是参数表、字段什么含义），也够得着（能查、能建、能跑）。\n\n![](images/e2.jpg)\n\n整个演示项目就是这么长出来的：我只提了一个朴素需求——\"帮我模拟一家 1200 家店的咖啡连锁，把该有的底表都建了\"。AI 生成了几十张表：会员、订单、积分、私域、加盟分账、门店成本，字段是真的（从我十几年业务经历里蒸馏的），数据是假的（全部模拟）。这套东西现在就躺在本仓库里。\n\n![](images/e3.jpg)\n\nETL 也进化了：从在画布上拖节点，到一段 SQL 直接跑。说实话，AI 写的不少 SQL 已经超出我的阅读能力，我找专业伙伴看过，他说能看懂大半——我不跟 AI 抢功劳，我出的是业务需求，它出的是工程。\n\n![](images/e4.jpg)\n\n以前\"把数据结构推倒重梳理\"是个大项目，现在是几分钟的事。改口径不用等排期：规则在表里不在代码里，业务改一个数字，重跑一次，清单自动重排。\n\n![](images/e5.jpg)\n\n那些没人想干的琐碎活——批量重命名、字段加注释、清理没人用的表——AI 全包了。\n\n![](images/e6.jpg)\n\n看板这块我的真实用法：我不懂 HTML，我只会说\"这个看板有点丑，能不能用自定义的方式做好看一点\"。它就去调自定义图表，颜色不满意再换。重点是数据源不是本地 Excel，是直接读库里的字段，自动更新，分享链路跟原生看板完全一样。\n\n![](images/e7.jpg)\n\n手机端看板过去是个大工程——在手机屏幕那么点地方拖模块，我搭过几次，实在不愿意再来。\n\n![](images/e8.jpg)\n\n现在是\"说出来就有\"，顺手还多一张二维码，扫码即看。我为什么执念移动端：后台数据不会骗人，一百张 PC 看板里，一个月被打开的寥寥无几；一线的人在路上，手机里能看清的数据才是真的在被用的数据。\n\n## 六、真演示：现场三个问题\n\n![](images/f1.jpg)\n\n演示规则：我全程只打中文，不写一行 SQL、不敲一条命令，查什么表、走什么路径都是 AI 自己决定的。有观众要提示词，我的提示词真的超简单，就是\"深圳有家店亏钱了，帮我看看是房租太贵、人工太高、原料涨价还是客流掉了，给我能落地的整改动作，指到责任人\"。\n\n![](images/f2.jpg)\n\n跑任务的等待时间本来准备了五分钟的解说词，结果这次不到一分钟就出结果了。等待也不是死时间——看它先去摸口径、看字段定义在哪，摸完才查数，这个\"先对口径再干活\"的习惯，比很多人强。\n\n![](images/f3.jpg)\n\n背景资料它开跑前已经读完：门店主档、豁免日历、参数表、归因清单，全在库里。\n\n![](images/f4.jpg)\n\n**三个问题，现场连问三层：**\n\n**第一问，为什么亏（归因到人）。** 深圳一家购物中心店连亏几个月。AI 排除了人工（没超）、原料（毛利率在升）、客流（营收高于同类中位），锁定房租：占比超商场店 28% 的上限五六个百分点，当月净利亏六千五。然后它做了一件我没让它做的事——横向对比深圳所有商场店，发现好几家房租全超标，这就不是一家店的经营问题，是深圳商场租金的结构性问题，得升到招商议价层去谈。最后落到人：店长袁十六复盘出品和服务，区域经理花十六去谈房租。\n\n**第二问，该不该报（AI 会闭嘴）。** 宁波一家校园店 2 月起营收从两万多掉到一万，月度亏损，系统要不要报？AI 说不报：学校店，2 月是寒假，豁免日历拦下——三四月开学后营收恢复，4 月还进了标杆，反向证明这次闭嘴闭对了。兰州一家开业六周的新店连亏被打了\"关店评估\"，AI 也把它捞回来：正常爬坡曲线，给它一点时间。这是我这次最想讲的部分：大家都在摸索 AI 能做什么，我已经让它做了很多，我现在琢磨的是怎么让它**不做**什么。\n\n**第三问，没报警就没问题吗（会多看一眼）。** 青岛一家购物中心店，看板上月月达标、还是标杆门店，但加盟商在私下吐槽。我就把这句话当提示词：\"这家店好像不太行，但我说不上来哪里不行，帮我挖一挖\"——第六感也可以是提示词。AI 像侦探一样顺藤摸瓜：利润没问题、堂食没问题，最后挖到评价——负评占比从 0 一路阴跌到 20%，每天的跌幅都够不到单日报警线，所以清单抓不到。结论给到店长：赶紧处理差评、回访客户；给到区域经理：你报上来的标杆门店，可能名不副实。\n\n**收口是日报。** 所有结果写成按区域经理分组的日报，谁家该复盘出品、谁家该回复差评，每人领自己的任务，通过 webhook 推到企业微信或飞书群——由人确认后发送，五步走完。\n\n## 七、你关心的五件事\n\n![](images/g1.jpg)\n\n直播间 70 多人，我预设了四种人：业务、数据分析师、IT、老板。这一节按人群回答当场的问题。\n\n![](images/g2.jpg)\n\n**权限（IT 最关心）。** AI 不开新口子，走的是老门：CLI 的权限就是你账号的权限，你是管理员就能看全库，你只有自己那几张表就只能看那几张。想认真做这件事，建议给公司里的超级个体开尽量多的**只读**权限，跑出结果再决定权限下放给谁。\n\n![](images/g3.jpg)\n\n**口径乱能不能起步（业务最关心）。** 能，但别做全局治理——挑最疼的一个场景先修一条路。我自己的起步案例：每天一份会员拉新日报，全国分公司排名，前三名表扬、倒数三名鞭策，发到管理层都在的群。为什么挑它？因为大家真的关心——上榜的人有融入感，被批评的人会较真，数据一错他们立马反馈。就这么磨了三四个星期，跟会员相关的字段 AI 基本就不出错了。遇到的坑主要一类：历史字段重名、没注释，AI 混淆——给字段打个括号、重新起个精准的名字，修修补补就好。\n\n![](images/g4.jpg)\n\n**模型怎么选。** 不重要，别用太便宜的就行。方法不绑模型，好马随时换。真正决定上限的是你维护的数据底表——底表干净到位，你别说 AI 了，随便来个新手分析师也能很快定位问题；底表烂，多强的模型都是快速地错。\n\n![](images/g5.jpg)\n\n**要不要立项组队。** 不用。一个人、一个普通的 agent 工具、每天免费领的那点额度，授权自己账号能读的数据集，用口语跟它说\"帮我查一下某家店\"，就能开始。在以前，这些事要提需求文档、等 IT 评审、等排期、等资源，反复沟通几个星期；现在一个业务自己就能跑通。\n\n## 八、收尾\n\n![](images/h1.jpg)\n\n过去是人打开报表来读，未来是 AI 读报表、人读结论。BI 的新角色不是\"看数据的地方\"，是\"替业务干活的助手\"。这不是贩卖焦虑——它给你的是一个可实操的出路，而且实操的成本低到一个人就能开始。\n\n![](images/h2.jpg)\n\n直播最后的核心意思，是把业务判断沉淀成可复核的参考口径。当时演示的整套环境有 54 个数据集、25 条 ETL、12 张看板；v1.4.1 拆分参数表后，当前仓库为 55 个逻辑数据集。复购、RFM、核销这些参考口径在[公式库](../../公式库/)；上线前仍需结合自家字段与数据验证。AI 时代真正落袋的，不是一张看板或一份日报，是你作为业务、作为人，在行业里那部分有价值的判断——把它沉淀出来，AI 才用得上，别人才接得住。\n\n---\n\n## 附：当场问答摘编\n\n**问：提示词怎么写才能让它查得准？**\n答：两个小技巧。一是把数据集或看板的网址直接复制给它，或者告诉它文件夹名字，它能精准定位；二是提问可以带上你的预判（\"我猜是房租，也可能是人工\"），它会逐个验证排除。\n\n**问：预警阈值需要人工输入吗？**\n答：分两类。寒暑假、新店爬坡这类**规则性豁免**要人维护在表里；数值阈值它会自己横向对比同店型、同城市的门店得出——我们没给它写死任何报警线。\n\n**问：怎么验证 AI 出的数据是对的？**\n答：老实说，除了人工复核没有银弹。我的做法是两道：我自己先验一遍再发出去；然后靠业务同学——他们对自己的数据最敏锐，错一点立马找上门。所以我发 AI 产出时会说明\"这是 AI 出的，大家多提意见\"，让反馈回路转起来。\n\n**问：已经用了两年 BI，怎么开始 AI 探索？**\n答：一个我觉得好用的姿势——带着批判的视角，用\"反派\"的方式问 AI：\"你现在是管理员，这套数据集和看板是两年攒下来的，我觉得非常冗余、非常糟糕，帮我批阅一下。\"别客气、别含蓄，它会挖出很多你想不到的东西。\n\n---\n\n*本文由 2026-07-09 直播逐字稿整理，演示数据全部为模拟生成（字段真实、数值虚构），与任何真实企业无关。插画板 34 页由 AI 批量生成（含中文乱码自检护栏），原始尺寸文件与生成管线未随仓库分发。*\n\n*讲述：马甲（@maojiebc）· 整理自直播实录*\n\nFile v1.4.1:_meta.json\n\n{\n  \"ownerId\": \"kn71njkqkab6a75db7hqb6ekz982jd29\",\n  \"slug\": \"majia-huiyuan\",\n  \"version\": \"1.4.1\",\n  \"publishedAt\": 1786264253239\n}\n\nFile v1.4.1:AGENTS.md\n\n# AGENTS.md — 给 AI Agent 的操作指引\n\n你正在访问的是一套**连锁餐饮会员数据中台参考实现**（模拟数据），五层数仓架构（DIM / DWD / DWS / ADS / DQC）。v1.4.1 的逻辑 SQL 已在原观远 BI workshop 快照上校正；原始 JSON 仍保留为历史审计资产。你的用户大概率是业务或数据分析背景，不是工程师——回答时先人话，后术语。\n\n## 事实速查\n\n| 项 | 值 |\n|---|---|\n| 逻辑数据集 | 55 个（DIM 10 / DWD 16 / DWS 16 / ADS 8 / DQC 1 / param 4） |\n| ETL 加工链 | 25 条 |\n| 看板 | 12 张 |\n| 模拟规模 | 会员 80,000 / 门店 1,200 / 加盟商 141 / 商品 74 / 订单 1,294,316 / 触达 500,000 |\n| 快照时间 | 2026-06-24 |\n| SQL 方言 | Spark 3.4 |\n| 协议 | MIT |\n| 数据真实性 | **全部模拟生成**，个人标识已打码 |\n| 公式库 | `公式库/` 10 册约 3100 行：60+ SQL（复购 / RFM / 核销 / DWD 范式 / 任务池 NBA 模型）+ 字段词典 + 39 生产 ETL 索引（蒸馏自真实履职，已脱敏；第 10 册以本仓库样板间为蓝本） |\n\n## 任务导航（你被要求做 X → 去读 Y）\n\n| 任务 | 路径 |\n|---|---|\n| 拿整体资产全景 | `清单/数据集清单.csv`、`清单/ETL清单.csv`、`清单/看板清单.csv`（列：分层,名称,ID） |\n| 查复购 / RFM / 核销等通用公式、字段词典、数据质量坑 | `公式库/README.md` 总入口（路由表 + 5 大坑），按主题进 10 册 |\n| 用户要做召回 / 提频 / 防流失 / 新客转化 / 派任务给导购 | `公式库/10-task-and-touch-recovery.md`（任务池 NBA 模型：九类任务×圈选依据×回收口径）+ 圈选源 `dws_会员生命周期` / `dws_会员RFM分层` / `dws_渠道迁移分析`；执行话术切 majia-siyu |\n| 用户要搭 CDP / 标签体系 / 身份打通 | `数据集/结构定义/dim_会员身份桥.md`（OneID 五类身份+匹配置信度）+ `公式库/02` 开篇顾客标识统一化 + `param_` 参数表模式（标签规则外置） |\n| 向用户讲解这套体系的设计思路 / 为什么这么设计 | `分享/区域运营的一天/README.md`（叙事版：痛点→五步→可信四件套→三案例，引用其中案例时注明数据为模拟） |\n| 解释某个指标 / 口径怎么算 | `ETL/逻辑SQL/` 下按表名找对应 md，读节点结构和 SQL |\n| 查归因、券、活动三条公共事实桥 | `ETL/公共口径/`；订单级唯一性、统一快照和业务验收以这里为准 |\n| 列出某张表的字段 | `数据集/结构定义/<表名>.md`（含字段数、行数、字段类型、维度/度量属性） |\n| 看字段实际长什么样 | `数据集/数据样本/<表名>.csv`（最多 200 行模拟样本，小表按实际规模；表头即当前 schema） |\n| 帮用户设计会员数据体系 | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 顺序讲，每层用途见 README「三分钟看懂」 |\n| 生成建表语句 | 用 `数据集/数据样本/*.csv` 表头 + `结构定义` 的类型信息推 schema |\n| 诊断用户现有体系的缺口 | 把 55 个逻辑数据集当 checklist，逐层对照用户已有的表 |\n| 复刻整套到观远 BI | 原始 JSON 只用于理解 v1.4.0 workshop DAG；按 v1.4.1 `逻辑SQL/` + `公共口径/` 在目标平台重建，平台操作切 majia-guanyuan |\n| 理解某张看板的构成 | 以 `看板/页面文档/<看板名>.md` 的 v1.4.1 字段清单为准；`看板/页面JSON/` 仅保留 v1.4.0 历史布局，含旧字段，不可直接导入 |\n\n## 命名与文件约定\n\n- **分层前缀**：`dim_` 档案 / `dwd_` 事件明细 / `dws_` 汇总 / `ads_` 应用报表 / `dqc_` 质检 / `param_` 阈值参数\n- **ETL 文件名**中括号内是节点构成缩写：`F`=FILTER_ROWS 过滤、`C`=CALCULATOR 计算、`G`=GROUP_BY 聚合、`S`=SQL_SCRIPT、`J`=JOIN_DATA 关联，`×N`=同类节点数。例：`etl_dws_会员RFM分层 (10节点·F+C+G+S+J)`\n- **同一资产的三种形态**：\n  - `结构定义/*.md` — guancli 导出的描述文档（最适合你直接读）\n  - `数据样本/*.csv` — 最多 200 行模拟数据，小表按实际规模（schema 与取值范围的示例）\n  - `原始JSON/*.json` — v1.4.0 平台历史定义，含完整节点 DAG（审计用，不是 v1.4.1 可导入包）\n- 关键身份字段：`会员ID`（M 前缀）、`门店ID`（S 前缀）、`顾客识别键`（跨渠道统一身份，配 `身份匹配置信度`），身份合并逻辑见 `dim_会员身份桥`\n\n## 硬约束（违反会误导用户）\n\n1. **数据是模拟的**：可以引用结构、字段、口径、比例关系的设计思路；**不可**把数值当真实经营数据引用或外推行业结论。\n2. **ID 不可移植**：JSON 内的资源 ID（数据集 / ETL / 卡片 ID）是 workshop 实例私有的，复刻时必须重新生成。\n3. **SQL 是 Spark 3.4 方言**：搬到其他引擎（MySQL / ClickHouse / PG）时注意函数差异，主动提醒用户。\n4. **引用要带路径**：向用户引用本库内容时，标注来源文件的相对路径，方便核对。\n5. 手机号等打码字段（`156****0925`）不要尝试补全或生成完整号码。\n6. **SQL 是待验证示例**：不得承诺“换表名即可生产”；上线前必须完成字段映射、小样本回放和业务不变量验收。\n7. **归因不等于增量**：没有随机对照或合格准实验时，只能叫“触达后关联/归因 GMV”，不能叫“贡献销售/增量 ROI”。\n\n## 推荐回答姿态\n\n- 用户问\"复购怎么算\"这类口径问题：先给一句人话结论，再贴 `ETL/逻辑SQL/` 里的对应逻辑，最后提醒口径可选项（如跨天 vs 非跨天）。\n- 用户要\"照着搭一套\"：不要一次吐 55 张表，按 DIM→DWD→DWS→ADS 分阶段给最小可用集（先档案+订单流水，再算汇总，再上报表）。\n- 口径类问题优先交叉引用本仓库 `公式库/`（通用 SQL 公式）与 `ETL/逻辑SQL/`（本样板间的实际实现），两处口径一致时置信度最高。\n\nFile v1.4.1:ETL/逻辑SQL/ads_会员私域驾驶舱.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 4\n- **节点类型分布:**\n  - INPUT_DATASET: 2\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - j23ea7e60564e47458b71d82 (dwd_订单)\n  - xc82fb232ecdc474f84cd43d (dwd_会员触达)\n- **数据输出目标:**\n  - ads_会员私域驾驶舱 (目录: 0523-马甲-demo)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818731\n- Name: dwd_订单\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (200,100)\n- InputDsId: j23ea7e60564e47458b71d82\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818732\n- Name: dwd_会员触达\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (200,250)\n- InputDsId: xc82fb232ecdc474f84cd43d\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点3\n- Id: id_1779326818733\n- Name: SQL处理\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818731 (dwd_订单)\n  - id_1779326818732 (dwd_会员触达)\n\n- **Used By (Outputs):**\n  - id_1779326818734 (ads_会员私域驾驶舱)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p\n```\n- 等价SQL:\n```sql\nWITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p\n```\n\n\n### 节点4\n- Id: id_1779326818734\n- Name: ads_会员私域驾驶舱\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818733 (SQL处理)\n- Position: (800,100)\n- OutputDsName: ads_会员私域驾驶舱\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 0523-马甲-demo\n- DataSourceDsId: p2bcc84756ad94855896dd97\n- DataSourceCreated: true\n- DirPath: 根目录 > 0523-马甲-demo\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (2)\n- **dwd_订单** (DATA_SET_FILE)\n  - ID: j23ea7e60564e47458b71d82\n- **dwd_会员触达** (DATA_SET_FILE)\n  - ID: xc82fb232ecdc474f84cd43d\n\n### 下游资源 (1)\n- **ads_会员私域驾驶舱** (DATA_SET_ETL)\n  - ID: p2bcc84756ad94855896dd97\n\nFile v1.4.1:ETL/逻辑SQL/ads_会员经营任务池.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 6\n- **节点类型分布:**\n  - INPUT_DATASET: 4\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - sedfdd84abacc4cb496c15e7 (dim_门店主档)\n  - u494a5b2caaf446b5b1ed8bf (dwd_会员经营任务)\n  - h551155a12fc04d88a57d319 (dim_会员主档)\n  - m6fdb5eaefa5742ef9e0ac58 (dim_员工导购)\n- **数据输出目标:**\n  - ads_会员经营任务池 (目录: 马甲的demo-0523)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818732\n- Name: dim_门店主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,400)\n- InputDsId: sedfdd84abacc4cb496c15e7\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818735\n- Name: ads_会员经营任务池\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (800,100)\n- OutputDsName: ads_会员经营任务池\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: nda316bda403346669b3fa1d\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点3\n- Id: id_1779326818730\n- Name: dwd_会员经营任务\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,100)\n- InputDsId: u494a5b2caaf446b5b1ed8bf\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点4\n- Id: id_1779326818734\n- Name: SQL处理\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818730 (dwd_会员经营任务)\n  - id_1779326818731 (dim_员工导购)\n  - id_1779326818732 (dim_门店主档)\n  - id_1779326818733 (dim_会员主档)\n\n- **Used By (Outputs):**\n  - id_1779326818735 (ads_会员经营任务池)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS as_of_date\n),\nstore_current AS (\n  SELECT * FROM input3 WHERE `当前版本标记` = 1\n)\nSELECT\n  t.`任务ID`, t.`任务优先级`, t.`任务类型`, t.`任务来源`,\n  t.`会员ID`, m.`会员等级`, m.`城市` AS `会员城市`,\n  t.`归属门店ID`, s.`门店名称`, s.`城市` AS `门店城市`, s.`店型`, s.`门店类型`,\n  t.`员工导购ID`, e.`姓名` AS `员工姓名`, e.`岗位`, e.`角色标签`,\n  t.`人群标签`, t.`推荐动作`, t.`推荐权益`, t.`推荐原因`,\n  t.`预计价值`, t.`任务生成时间`, t.`任务截止时间`, t.`任务失效时间`,\n  t.`触达状态`, t.`触达时间`, t.`触达方式`,\n  t.`触达后下单`, t.`触达后下单金额`, t.`任务结果`,\n  CASE\n    WHEN t.`任务结果` LIKE '已完成%' THEN '已完结'\n    WHEN t.`任务失效时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY THEN '已过期'\n    ELSE '进行中'\n  END AS `执行状态`,\n  CASE\n    WHEN t.`触达后下单` = 1 THEN '有转化'\n    WHEN t.`触达状态` = '已触达' THEN '已触达未转化'\n    ELSE '未触达'\n  END AS `转化阶段`,\n  p.as_of_date AS `数据快照日期`\nFROM input1 t\nLEFT JOIN input2 e ON t.`员工导购ID` = e.`员工ID`\nLEFT JOIN store_current s ON t.`归属门店ID` = s.`门店ID`\nLEFT JOIN input4 m ON t.`会员ID` = m.`会员ID`\nCROSS JOIN params p\nWHERE t.`任务生成时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY\n```\n- 等价SQL:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS as_of_date\n),\nstore_current AS (\n  SELECT * FROM input3 WHERE `当前版本标记` = 1\n)\nSELECT\n  t.`任务ID`, t.`任务优先级`, t.`任务类型`, t.`任务来源`,\n  t.`会员ID`, m.`会员等级`, m.`城市` AS `会员城市`,\n  t.`归属门店ID`, s.`门店名称`, s.`城市` AS `门店城市`, s.`店型`, s.`门店类型`,\n  t.`员工导购ID`, e.`姓名` AS `员工姓名`, e.`岗位`, e.`角色标签`,\n  t.`人群标签`, t.`推荐动作`, t.`推荐权益`, t.`推荐原因`,\n  t.`预计价值`, t.`任务生成时间`, t.`任务截止时间`, t.`任务失效时间`,\n  t.`触达状态`, t.`触达时间`, t.`触达方式`,\n  t.`触达后下单`, t.`触达后下单金额`, t.`任务结果`,\n  CASE\n    WHEN t.`任务结果` LIKE '已完成%' THEN '已完结'\n    WHEN t.`任务失效时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY THEN '已过期'\n    ELSE '进行中'\n  END AS `执行状态`,\n  CASE\n    WHEN t.`触达后下单` = 1 THEN '有转化'\n    WHEN t.`触达状态` = '已触达' THEN '已触达未转化'\n    ELSE '未触达'\n  END AS `转化阶段`,\n  p.as_of_date AS `数据快照日期`\nFROM input1 t\nLEFT JOIN input2 e ON t.`员工导购ID` = e.`员工ID`\nLEFT JOIN store_current s ON t.`归属门店ID` = s.`门店ID`\nLEFT JOIN input4 m ON t.`会员ID` = m.`会员ID`\nCROSS JOIN params p\nWHERE t.`任务生成时间` < CAST(p.as_of_date AS TIMESTAMP) + INTERVAL 1 DAY\n```\n\n\n### 节点5\n- Id: id_1779326818733\n- Name: dim_会员主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,550)\n- InputDsId: h551155a12fc04d88a57d319\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点6\n- Id: id_1779326818731\n- Name: dim_员工导购\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818734 (SQL处理)\n- Position: (200,250)\n- InputDsId: m6fdb5eaefa5742ef9e0ac58\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (4)\n- **dwd_会员经营任务** (DATA_SET_FILE)\n  - ID: u494a5b2caaf446b5b1ed8bf\n- **dim_门店主档** (DATA_SET_FILE)\n  - ID: sedfdd84abacc4cb496c15e7\n- **dim_员工导购** (DATA_SET_FILE)\n  - ID: m6fdb5eaefa5742ef9e0ac58\n- **dim_会员主档** (DATA_SET_FILE)\n  - ID: h551155a12fc04d88a57d319\n\n### 下游资源 (1)\n- **ads_会员经营任务池** (DATA_SET_ETL)\n  - ID: nda316bda403346669b3fa1d\n\nFile v1.4.1:ETL/逻辑SQL/ads_门店每日指挥台.md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 5\n- **节点类型分布:**\n  - INPUT_DATASET: 3\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - sedfdd84abacc4cb496c15e7 (dim_门店主档)\n  - af8234caa4e90486793eaab8 (dwd_评价)\n  - j23ea7e60564e47458b71d82 (dwd_订单)\n- **数据输出目标:**\n  - ads_门店每日指挥台 (目录: 马甲的demo-0523)\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779326818730\n- Name: dim_门店主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,250)\n- InputDsId: sedfdd84abacc4cb496c15e7\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点2\n- Id: id_1779326818731\n- Name: dwd_评价\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,400)\n- InputDsId: af8234caa4e90486793eaab8\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点3\n- Id: id_1779326818733\n- Name: ads_门店每日指挥台\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (800,100)\n- OutputDsName: ads_门店每日指挥台\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: nd177a0ac0eda44ac98c75bc\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点4\n- Id: id_1779326818732\n- Name: 营业日历骨架+日指标+自然日基线\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779326818729 (dwd_订单)\n  - id_1779326818730 (dim_门店主档)\n  - id_1779326818731 (dwd_评价)\n\n- **Used By (Outputs):**\n  - id_1779326818733 (ads_门店每日指挥台)\n- Position: (500,100)\n- SqlScript:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS `as_of_date` -- 生产由调度参数替换\n),\nstore_current AS (\n  -- 当前版本只负责提供每家门店唯一的开闭店边界。\n  SELECT\n    s.`门店ID`, s.`开业日期`,\n    CASE WHEN s.`闭店日期` IS NULL OR TRIM(s.`闭店日期`) = '' OR LOWER(TRIM(s.`闭店日期`)) = 'null'\n         THEN NULL ELSE TO_DATE(s.`闭店日期`) END AS `闭店日期`\n  FROM input2 s\n  WHERE s.`当前版本标记` = 1\n),\nstore_bounds AS (\n  SELECT s.`门店ID`, s.`开业日期`, COALESCE(s.`闭店日期`, p.`as_of_date`) AS `营业截止日期`, p.`as_of_date`\n  FROM store_current s\n  CROSS JOIN params p\n  WHERE s.`开业日期` IS NOT NULL\n    AND s.`开业日期` <= p.`as_of_date`\n    AND COALESCE(s.`闭店日期`, p.`as_of_date`) >= s.`开业日期`\n),\nstore_calendar AS (\n  -- 门店×自然营业日期骨架：即使当天 0 单也会有一行。\n  SELECT s.`门店ID`, d.`业务日期`, s.`as_of_date` AS `数据快照日期`\n  FROM store_bounds s\n  LATERAL VIEW EXPLODE(SEQUENCE(\n    s.`开业日期`,\n    LEAST(s.`as_of_date`, s.`营业截止日期`),\n    INTERVAL 1 DAY\n  )) d AS `业务日期`\n),\norder_daily AS (\n  SELECT\n    o.`门店ID`, o.`业务日期`,\n    COUNT(DISTINCT o.`订单ID`) AS `订单数`,\n    SUM(o.`实付金额`) AS `销售额`,\n    COUNT(DISTINCT CASE WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`订单ID` END) AS `会员订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 1 THEN o.`订单ID` END) AS `到店订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 0 THEN o.`订单ID` END) AS `外卖订单数`,\n    SUM(o.`折扣金额`) AS `折扣总额`,\n    SUM(o.`原价金额`) AS `原价总额`\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成' AND o.`业务日期` <= p.`as_of_date`\n  GROUP BY o.`门店ID`, o.`业务日期`\n),\nreview_daily AS (\n  SELECT\n    r.`门店ID`, r.`评价日期` AS `业务日期`,\n    AVG(r.`评分`) AS `当日评分`,\n    COUNT(*) AS `当日评价数`,\n    SUM(CASE WHEN r.`评分` <= 2 AND r.`回复状态` = '未回复' THEN 1 ELSE 0 END) AS `未回复负评数`\n  FROM input3 r\n  CROSS JOIN params p\n  WHERE r.`评价日期` <= p.`as_of_date`\n  GROUP BY r.`门店ID`, r.`评价日期`\n),\njoined AS (\n  SELECT\n    b.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`,\n    CASE WHEN DATEDIFF(b.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN 'TRUE' ELSE 'FALSE' END AS `是否90天内新店`,\n    CASE WHEN DATEDIFF(b.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN '90天新店' ELSE '成熟店' END AS `新店标签`,\n    b.`业务日期`, COALESCE(o.`订单数`, 0) AS `订单数`, COALESCE(o.`销售额`, 0) AS `销售额`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`销售额` / o.`订单数` ELSE NULL END AS `平均客单价_基线口径`,\n    COALESCE(o.`会员订单数`, 0) AS `会员订单数`, COALESCE(o.`到店订单数`, 0) AS `到店订单数`,\n    COALESCE(o.`外卖订单数`, 0) AS `外卖订单数`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`会员订单数` * 1.0 / o.`订单数` ELSE 0 END AS `会员订单占比`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`到店订单数` * 1.0 / o.`订单数` ELSE 0 END AS `到店占比`,\n    CASE WHEN COALESCE(o.`原价总额`, 0) > 0 THEN o.`折扣总额` / o.`原价总额` ELSE 0 END AS `折扣率`,\n    COALESCE(r.`当日评分`, 5) AS `当日评分`, COALESCE(r.`当日评价数`, 0) AS `当日评价数`,\n    COALESCE(r.`未回复负评数`, 0) AS `未回复负评数`,\n    COALESCE(o.`折扣总额`, 0) AS `折扣总额`, COALESCE(o.`原价总额`, 0) AS `原价总额`,\n    b.`数据快照日期`\n  FROM store_calendar b\n  LEFT JOIN input2 s\n    ON b.`门店ID` = s.`门店ID`\n   AND b.`业务日期` >= s.`生效起始日期`\n   AND b.`业务日期` <= COALESCE(s.`生效截止日期`, DATE '9999-12-31')\n  LEFT JOIN order_daily o ON b.`门店ID` = o.`门店ID` AND b.`业务日期` = o.`业务日期`\n  LEFT JOIN review_daily r ON b.`门店ID` = r.`门店ID` AND b.`业务日期` = r.`业务日期`\n),\nwith_baseline AS (\n  SELECT *,\n    -- 因骨架每天一行，ROWS 14 PRECEDING 就是前 14 个自然日；AVG 自动忽略零订单日的 NULL 客单价。\n    AVG(`平均客单价_基线口径`) OVER (\n      PARTITION BY `门店ID` ORDER BY `业务日期` ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING\n    ) AS `客单价基线`\n  FROM joined\n)\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `店型`, `门店类型`,\n  `商圈`, `是否90天内新店`, `新店标签`,\n  `业务日期`, `订单数`, `销售额`, COALESCE(`平均客单价_基线口径`, 0) AS `平均客单价`,\n  `会员订单数`, `到店订单数`, `外卖订单数`, `会员订单占比`, `到店占比`, `折扣率`,\n  `当日评分`, `未回复负评数`,\n  CASE\n    WHEN `订单数` = 0 THEN '客流异常' -- 覆盖闭店、断数、POS 未上传等最严重场景\n    WHEN `订单数` < 5 THEN '客流异常'\n    WHEN `未回复负评数` >= 1 THEN '口碑异常'\n    WHEN `当日评价数` >= 2 AND `当日评分` <= 3.0 THEN '评分滑坡'\n    WHEN `原价总额` > 0 AND `折扣总额` / `原价总额` > 0.30 THEN '折扣过高'\n    WHEN `订单数` >= 10 AND `会员订单数` * 1.0 / `订单数` < 0.10 THEN '会员占比异常'\n    WHEN `订单数` >= 10 AND `客单价基线` IS NOT NULL\n         AND `平均客单价_基线口径` < 0.4 * `客单价基线` THEN '客单价异常'\n    ELSE '正常'\n  END AS `今日异常`,\n  `数据快照日期`\nFROM with_baseline\n\n```\n- 等价SQL:\n```sql\nWITH params AS (\n  SELECT DATE '2026-06-24' AS `as_of_date` -- 生产由调度参数替换\n),\nstore_current AS (\n  -- 当前版本只负责提供每家门店唯一的开闭店边界。\n  SELECT\n    s.`门店ID`, s.`开业日期`,\n    CASE WHEN s.`闭店日期` IS NULL OR TRIM(s.`闭店日期`) = '' OR LOWER(TRIM(s.`闭店日期`)) = 'null'\n         THEN NULL ELSE TO_DATE(s.`闭店日期`) END AS `闭店日期`\n  FROM input2 s\n  WHERE s.`当前版本标记` = 1\n),\nstore_bounds AS (\n  SELECT s.`门店ID`, s.`开业日期`, COALESCE(s.`闭店日期`, p.`as_of_date`) AS `营业截止日期`, p.`as_of_date`\n  FROM store_current s\n  CROSS JOIN params p\n  WHERE s.`开业日期` IS NOT NULL\n    AND s.`开业日期` <= p.`as_of_date`\n    AND COALESCE(s.`闭店日期`, p.`as_of_date`) >= s.`开业日期`\n),\nstore_calendar AS (\n  -- 门店×自然营业日期骨架：即使当天 0 单也会有一行。\n  SELECT s.`门店ID`, d.`业务日期`, s.`as_of_date` AS `数据快照日期`\n  FROM store_bounds s\n  LATERAL VIEW EXPLODE(SEQUENCE(\n    s.`开业日期`,\n    LEAST(s.`as_of_date`, s.`营业截止日期`),\n    INTERVAL 1 DAY\n  )) d AS `业务日期`\n),\norder_daily AS (\n  SELECT\n    o.`门店ID`, o.`业务日期`,\n    COUNT(DISTINCT o.`订单ID`) AS `订单数`,\n    SUM(o.`实付金额`) AS `销售额`,\n    COUNT(DISTINCT CASE WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`订单ID` END) AS `会员订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 1 THEN o.`订单ID` END) AS `到店订单数`,\n    COUNT(DISTINCT CASE WHEN o.`是否到店` = 0 THEN o.`订单ID` END) AS `外卖订单数`,\n    SUM(o.`折扣金额`) AS `折扣总额`,\n    SUM(o.`原价金额`) AS `原价总额`\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成' AND o.`业务日期` <= p.`as_of_date`\n  GROUP BY o.`门店ID`, o.`业务日期`\n),\nreview_daily AS (\n  SELECT\n    r.`门店ID`, r.`评价日期` AS `业务日期`,\n    AVG(r.`评分`) AS `当日评分`,\n    COUNT(*) AS `当日评价数`,\n    SUM(CASE WHEN r.`评分` <= 2 AND r.`回复状态` = '未回复' THEN 1 ELSE 0 END) AS `未回复负评数`\n  FROM input3 r\n  CROSS JOIN params p\n  WHERE r.`评价日期` <= p.`as_of_date`\n  GROUP BY r.`门店ID`, r.`评价日期`\n),\njoined AS (\n  SELECT\n    b.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`店型`, s.`门店类型`, s.`商圈`,\n    CASE WHEN DATEDIFF(b.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN 'TRUE' ELSE 'FALSE' END AS `是否90天内新店`,\n    CASE WHEN DATEDIFF(b.`业务日期`, s.`开业日期`) BETWEEN 0 AND 89 THEN '90天新店' ELSE '成熟店' END AS `新店标签`,\n    b.`业务日期`, COALESCE(o.`订单数`, 0) AS `订单数`, COALESCE(o.`销售额`, 0) AS `销售额`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`销售额` / o.`订单数` ELSE NULL END AS `平均客单价_基线口径`,\n    COALESCE(o.`会员订单数`, 0) AS `会员订单数`, COALESCE(o.`到店订单数`, 0) AS `到店订单数`,\n    COALESCE(o.`外卖订单数`, 0) AS `外卖订单数`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`会员订单数` * 1.0 / o.`订单数` ELSE 0 END AS `会员订单占比`,\n    CASE WHEN COALESCE(o.`订单数`, 0) > 0 THEN o.`到店订单数` * 1.0 / o.`订单数` ELSE 0 END AS `到店占比`,\n    CASE WHEN COALESCE(o.`原价总额`, 0) > 0 THEN o.`折扣总额` / o.`原价总额` ELSE 0 END AS `折扣率`,\n    COALESCE(r.`当日评分`, 5) AS `当日评分`, COALESCE(r.`当日评价数`, 0) AS `当日评价数`,\n    COALESCE(r.`未回复负评数`, 0) AS `未回复负评数`,\n    COALESCE(o.`折扣总额`, 0) AS `折扣总额`, COALESCE(o.`原价总额`, 0) AS `原价总额`,\n    b.`数据快照日期`\n  FROM store_calendar b\n  LEFT JOIN input2 s\n    ON b.`门店ID` = s.`门店ID`\n   AND b.`业务日期` >= s.`生效起始日期`\n   AND b.`业务日期` <= COALESCE(s.`生效截止日期`, DATE '9999-12-31')\n  LEFT JOIN order_daily o ON b.`门店ID` = o.`门店ID` AND b.`业务日期` = o.`业务日期`\n  LEFT JOIN review_daily r ON b.`门店ID` = r.`门店ID` AND b.`业务日期` = r.`业务日期`\n),\nwith_baseline AS (\n  SELECT *,\n    -- 因骨架每天一行，ROWS 14 PRECEDING 就是前 14 个自然日；AVG 自动忽略零订单日的 NULL 客单价。\n    AVG(`平均客单价_基线口径`) OVER (\n      PARTITION BY `门店ID` ORDER BY `业务日期` ROWS BETWEEN 14 PRECEDING AND 1 PRECEDING\n    ) AS `客单价基线`\n  FROM joined\n)\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `店型`, `门店类型`,\n  `商圈`, `是否90天内新店`, `新店标签`,\n  `业务日期`, `订单数`, `销售额`, COALESCE(`平均客单价_基线口径`, 0) AS `平均客单价`,\n  `会员订单数`, `到店订单数`, `外卖订单数`, `会员订单占比`, `到店占比`, `折扣率`,\n  `当日评分`, `未回复负评数`,\n  CASE\n    WHEN `订单数` = 0 THEN '客流异常' -- 覆盖闭店、断数、POS 未上传等最严重场景\n    WHEN `订单数` < 5 THEN '客流异常'\n    WHEN `未回复负评数` >= 1 THEN '口碑异常'\n    WHEN `当日评价数` >= 2 AND `当日评分` <= 3.0 THEN '评分滑坡'\n    WHEN `原价总额` > 0 AND `折扣总额` / `原价总额` > 0.30 THEN '折扣过高'\n    WHEN `订单数` >= 10 AND `会员订单数` * 1.0 / `订单数` < 0.10 THEN '会员占比异常'\n    WHEN `订单数` >= 10 AND `客单价基线` IS NOT NULL\n         AND `平均客单价_基线口径` < 0.4 * `客单价基线` THEN '客单价异常'\n    ELSE '正常'\n  END AS `今日异常`,\n  `数据快照日期`\nFROM with_baseline\n\n```\n\n\n### 节点5\n- Id: id_1779326818729\n- Name: dwd_订单\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779326818732 (营业日历骨架+日指标+自然日基线)\n- Position: (200,100)\n- InputDsId: j23ea7e60564e47458b71d82\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (3)\n- **dwd_订单** (DATA_SET_FILE)\n  - ID: j23ea7e60564e47458b71d82\n- **dim_门店主档** (DATA_SET_FILE)\n  - ID: sedfdd84abacc4cb496c15e7\n- **dwd_评价** (DATA_SET_FILE)\n  - ID: af8234caa4e90486793eaab8\n\n### 下游资源 (1)\n- **ads_门店每日指挥台** (DATA_SET_ETL)\n  - ID: nd177a0ac0eda44ac98c75bc\n\nFile v1.4.1:ETL/逻辑SQL/ads_高层经营驾驶舱.md\n\n你是一个 ETL 专家，正在查看如下 ETL 的定义。所有节点运行在 Apache Spark 3.4，SQL 只能使用 Spark SQL。\n\n## 基本信息\n\n- UniformResourceType: DATA_PROCESS_ETL\n- 版本口径: v1.4.1\n\n## ETL 流程摘要\n\n- **数据输入源:**\n  - `dwd_订单`\n  - `dwd_会员触达`\n- **数据输出目标:** `ads_高层经营驾驶舱`\n- **运行参数:** `as_of_date`，必填，格式 `yyyy-MM-dd`；调度器在运行前替换 `${as_of_date}`。\n- **归因窗口:** 触达时间起（含）至触达时间后 8×24 小时（不含），即滚动 0–7 天。\n\n## v1.4.1 业务口径\n\n1. 总销售、会员销售、到店销售和关联销售全部按订单发生日汇总，分子分母处于同一天。\n2. 私域订单只允许归属于下单前最近一次有效触达；用 `ROW_NUMBER` 将同一订单的归因优先级固定为 1，杜绝重复归因。\n3. 归因桥保留 `订单ID、触达ID、触达时间、下单时间、归因规则、归因优先级`，便于 DQC 逐单审计。\n4. 没有对照组时，只能称“触达后关联销售”，不能称“私域贡献销售”或增量收入。\n5. 原字段“到店订单占比”实际按销售额计算，v1.4.1 更名为“到店销售额占比”。\n\n## 核心 SQL\n\n输入顺序：`input1 = dwd_订单`，`input2 = dwd_会员触达`。\n\n```sql\nWITH params AS (\n  SELECT\n    CAST('${as_of_date}' AS DATE) AS `as_of_date`,\n    7 AS `归因窗口天数`\n),\nvalid_order AS (\n  SELECT o.*\n  FROM input1 o\n  CROSS JOIN params p\n  WHERE o.`订单状态` = '已完成'\n    AND o.`业务日期` <= p.`as_of_date`\n),\nvalid_touch AS (\n  SELECT t.*\n  FROM input2 t\n  CROSS JOIN params p\n  WHERE t.`触达状态` = '已发送'\n    AND t.`会员ID` IS NOT NULL AND t.`会员ID` <> ''\n    AND t.`触达日期` <= p.`as_of_date`\n),\norder_daily AS (\n  SELECT\n    o.`业务日期`,\n    SUM(o.`实付金额`) AS `总销售`,\n    SUM(CASE\n      WHEN o.`会员ID` IS NOT NULL AND o.`会员ID` <> '' THEN o.`实付金额`\n      ELSE 0\n    END) AS `会员销售`,\n    SUM(CASE WHEN o.`是否到店` = 1 THEN o.`实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT o.`订单ID`) AS `总订单数`,\n    COUNT(DISTINCT o.`会员ID`) AS `活跃会员数`,\n    COUNT(DISTINCT CASE WHEN o.`是否会员首单` = 1 THEN o.`会员ID` END) AS `新增会员数`\n  FROM valid_order o\n  GROUP BY o.`业务日期`\n),\ntouch_order_candidates AS (\n  SELECT\n    o.`订单ID`,\n    t.`触达ID`,\n    t.`触达时间`,\n    o.`下单时间`,\n    o.`业务日期` AS `订单发生日期`,\n    o.`实付金额`,\n    '下单前最近一次有效触达' AS `归因规则`,\n    ROW_NUMBER() OVER (\n      PARTITION BY o.`订单ID`\n      ORDER BY t.`触达时间` DESC, t.`触达ID` DESC\n    ) AS `归因优先级`\n  FROM valid_order o\n  JOIN valid_touch t\n    ON o.`会员ID` = t.`会员ID`\n   AND o.`会员ID` IS NOT NULL AND o.`会员ID` <> ''\n   AND o.`下单时间` >= t.`触达时间`\n   AND o.`下单时间` < t.`触达时间` + INTERVAL 8 DAYS\n),\ntouch_order_bridge AS (\n  SELECT\n    `订单ID`, `触达ID`, `触达时间`, `下单时间`, `订单发生日期`,\n    `实付金额`, `归因规则`, `归因优先级`\n  FROM touch_order_candidates\n  WHERE `归因优先级` = 1\n),\ntouch_order_daily AS (\n  SELECT\n    b.`订单发生日期` AS `业务日期`,\n    COUNT(DISTINCT b.`订单ID`) AS `触达后关联订单数`,\n    SUM(b.`实付金额`) AS `触达后关联销售`\n  FROM touch_order_bridge b\n  GROUP BY b.`订单发生日期`\n)\nSELECT\n  d.`业务日期`,\n  d.`总销售`,\n  d.`会员销售`,\n  d.`到店销售`,\n  d.`总订单数`,\n  d.`活跃会员数`,\n  d.`新增会员数`,\n  COALESCE(a.`触达后关联订单数`, 0) AS `触达后关联订单数`,\n  COALESCE(a.`触达后关联销售`, 0.0) AS `触达后关联销售`,\n  CASE WHEN d.`总销售` > 0 THEN d.`会员销售` / d.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN d.`总销售` > 0 THEN d.`到店销售` / d.`总销售` ELSE 0 END AS `到店销售额占比`,\n  CASE\n    WHEN d.`总销售` > 0 THEN COALESCE(a.`触达后关联销售`, 0.0) / d.`总销售`\n    ELSE 0\n  END AS `触达后关联销售占比`,\n  p.`归因窗口天数`,\n  '下单前最近一次有效触达；每订单唯一' AS `归因规则`,\n  p.`as_of_date` AS `数据快照日期`\nFROM order_daily d\nLEFT JOIN touch_order_daily a\n  ON d.`业务日期` = a.`业务日期`\nCROSS JOIN params p\n```\n\n## 验收约束\n\n- `touch_order_bridge` 中 `订单ID` 必须唯一。\n- 每日 `触达后关联订单数 <= 总订单数`。\n- 每日 `触达后关联销售 <= 总销售`，允许因退款冲销或负金额数据触发例外并进入 DQC 人工核验。\n- `会员销售占比`、`到店销售额占比`、`触达后关联销售占比` 在正常非负订单口径下均应处于 `[0, 1]`。\n- 所有业务日期不得晚于 `as_of_date`。\n\n## 血缘关系\n\n- 上游：`dwd_订单`、`dwd_会员触达`\n- 下游：`ads_高层经营驾驶舱`\n\nFile v1.4.1:ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md\n\n你是一个ETL专家, 正在查看如下ETL的定义(注意: 这里的所有节点都会运行在 Apache Spark 3.4上, 所有的SQL语法都是Spark的语法, 当用户让优化性能时, 不要给出建索引等通用的建议, 因为Spark不能建立索引, 并且这个ETL只能使用Spark SQL(不能使用DataFrame API), 主要给出可以\"通过优化ETL节点的写法来优化性能\"这种优化建议):\n\n## 基本信息\n- UniformResourceType: DATA_PROCESS_ETL\n---\n## ETL 流程摘要\n\n- **总节点数:** 9\n- **节点类型分布:**\n  - CALCULATOR: 1\n  - INPUT_DATASET: 4\n  - JOIN_DATA: 2\n  - OUTPUT_DATASET: 1\n  - SQL_SCRIPT: 1\n- **数据输入源:**\n  - l6ee75fc812be413583215e4 (dws_单店利润月汇总)\n  - w55d0570b98a143579807416 (dwd_加盟合同明细)\n  - e620121168c3447c3abe4948 (dim_加盟商主档)\n  - vf66c6e915ad048c49cbcf25 (dws_加盟回本测算)\n- **数据输出目标:**\n  - ads_加盟商单店报告 (目录: 马甲的demo-0523)\n- **时间口径:** 继承 `dws_单店利润月汇总.数据快照日期`，与同批次 `as_of_date` 一致\n---\n## ETL 节点详细信息\n\n\n### 节点1\n- Id: id_1779346227920\n- Name: 同侪定位+改进建议+总部支持\n- Type: CALCULATOR\n- **Sources (Inputs):**\n  - id_1779346227919 (关联回本测算)\n\n- **Used By (Outputs):**\n  - id_1779346227921 (ads_加盟商单店报告)\n- Position: (1043,64)\n- FormulaNames:\n  - 本店位置标签\n  - 可改进项\n  - 总部本月支持\n- 等价SQL:\n```sql\nSELECT\n  `门店ID`, `门店名称`, `省份`, `城市`, `城市层级`, `门店类型`, `商圈`,\n  `加盟商ID`, `加盟商名称`, `加盟商类型`, `合作状态`, `信用等级`, `签约日期`,\n  `月份`, `月营收`, `堂食营收`, `外卖营收`, `订单数`,\n  `毛利`, `店面贡献利润`, `单店净利润`, `毛利率`, `店面贡献利润率`,\n  `堂食占比`, `外卖占比`, `人工占比`, `房租占比`, `客单价`,\n  `同侪门店数`, `城市同店型_营收_P25`, `城市同店型_营收_中位数`, `城市同店型_营收_P75`,\n  `城市同店型_利润率_P25`, `城市同店型_利润率_中位数`, `城市同店型_利润率_P75`,\n  `城市同店型_堂食占比_中位数`, `营收_对中位数比`, `利润率_对中位数差`, `堂食占比_对中位数差`,\n  `总投资额`, `累计店面贡献利润`, `累计回本率`, `预计完整回本月数`, `已开业月数`,\n  `投资起始日`, `剩余回本月数`, `回本状态`, `预计完整回本日期`,\n  `招商承诺回本月数`, `回本偏离度`, `回本风险等级`, `标杆门店标志`,\n  case when `营收_对中位数比` >= 1.5 then '顶部 Top 25%' when `营收_对中位数比` >= 1.1 then '中上 P50-P75' when `营收_对中位数比` >= 0.9 then '中位 ±10%' when `营收_对中位数比` >= 0.7 then '中下 P25-P50' else '尾部 Bottom 25%' end AS `本店位置标签`,\n  case when `店面贡献利润` < 0 then '亏损中, 建议联系督导专项支持' when `营收_对中位数比` < 0.7 then '营收低于同侪 30%+, 建议会员拉新+私域引流' when `堂食占比_对中位数差` < -0.10 then '堂食占比低于同侪 10pp+, 建议堂食提振专题' when `人工占比` > 0.25 then '人工占比偏高, 建议优化排班' when `房租占比` > 0.30 then '房租压力大, 建议提升日均营收' when `利润率_对中位数差` >= 0.05 then '同侪标杆, 持续优秀!' else '运营正常, 继续保持' end AS `可改进项`,\n  case when `合作状态` = '正常合作' then '提供品牌活动 + 私域内容 + 督导巡店' when `合作状态` = '续约预警' then '加强督导 + 专项营销补贴' when `合作状态` = '关注名单' then '高频督导 + 定制运营方案' else '专项处理' end AS `总部本月支持`,\n  `数据快照日期`\nFROM input1\n```\n\n\n### 节点2\n- Id: id_1779346227921\n- Name: ads_加盟商单店报告\n- Type: OUTPUT_DATASET\n- **Sources (Inputs):**\n  - id_1779346227920 (同侪定位+改进建议+总部支持)\n- Position: (1247,64)\n- OutputDsName: ads_加盟商单店报告\n- ParentDirId: v2b6bde3d41444cfd9e6d7ef\n- ParentDirName: 马甲的demo-0523\n- DataSourceDsId: n7e1bd96a3dcf48e88f18022\n- DataSourceCreated: true\n- DirPath: 根目录 > 马甲的demo-0523\n- 等价SQL:\n```sql\nSELECT * FROM input1\n```\n\n\n### 节点3\n- Id: id_1779346227918\n- Name: 关联加盟商信息\n- Type: JOIN_DATA\n- **Sources (Inputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n  - id_1779346227915 (dim_加盟商主档)\n\n- **Used By (Outputs):**\n  - id_1779346227919 (关联回本测算)\n- Position: (635,64)\n- 等价SQL:\n```sql\nSELECT\n  f.`门店ID`, f.`门店名称`, f.`省份`, f.`城市`, f.`城市层级`, f.`门店类型`, f.`商圈`,\n  f.`加盟商ID`, d.`加盟商名称`, d.`加盟商类型`, d.`合作状态`, d.`信用等级`, f.`签约日期`,\n  f.`月份`, f.`月营收`, f.`堂食营收`, f.`外卖营收`, f.`订单数`,\n  f.`毛利`, f.`店面贡献利润`, f.`单店净利润`, f.`毛利率`, f.`店面贡献利润率`,\n  f.`堂食占比`, f.`外卖占比`, f.`人工占比`, f.`房租占比`, f.`客单价`,\n  f.`同侪门店数`, f.`城市同店型_营收_P25`, f.`城市同店型_营收_中位数`, f.`城市同店型_营收_P75`,\n  f.`城市同店型_利润率_P25`, f.`城市同店型_利润率_中位数`, f.`城市同店型_利润率_P75`,\n  f.`城市同店型_堂食占比_中位数`, f.`营收_对中位数比`, f.`利润率_对中位数差`, f.`堂食占比_对中位数差`,\n  f.`数据快照日期`\nFROM input1 f\nLEFT JOIN input2 d ON f.`加盟商ID` = d.`加盟商ID`\n```\n\n\n### 节点4\n- Id: id_1779346227919\n- Name: 关联回本测算\n- Type: JOIN_DATA\n- **Sources (Inputs):**\n  - id_1779346227918 (关联加盟商信息)\n  - id_1779346227916 (dws_加盟回本测算)\n\n- **Used By (Outputs):**\n  - id_1779346227920 (同侪定位+改进建议+总部支持)\n- Position: (839,64)\n- 等价SQL:\n```sql\nSELECT\n  f.`门店ID`, f.`门店名称`, f.`省份`, f.`城市`, f.`城市层级`, f.`门店类型`, f.`商圈`,\n  f.`加盟商ID`, f.`加盟商名称`, f.`加盟商类型`, f.`合作状态`, f.`信用等级`, f.`签约日期`,\n  f.`月份`, f.`月营收`, f.`堂食营收`, f.`外卖营收`, f.`订单数`,\n  f.`毛利`, f.`店面贡献利润`, f.`单店净利润`, f.`毛利率`, f.`店面贡献利润率`,\n  f.`堂食占比`, f.`外卖占比`, f.`人工占比`, f.`房租占比`, f.`客单价`,\n  f.`同侪门店数`, f.`城市同店型_营收_P25`, f.`城市同店型_营收_中位数`, f.`城市同店型_营收_P75`,\n  f.`城市同店型_利润率_P25`, f.`城市同店型_利润率_中位数`, f.`城市同店型_利润率_P75`,\n  f.`城市同店型_堂食占比_中位数`, f.`营收_对中位数比`, f.`利润率_对中位数差`, f.`堂食占比_对中位数差`,\n  r.`总投资额`, r.`累计店面贡献利润`, r.`累计回本率`, r.`预计完整回本月数`, r.`已开业月数`,\n  r.`投资起始日`, r.`剩余回本月数`, r.`回本状态`, r.`预计完整回本日期`,\n  r.`招商承诺回本月数`, r.`回本偏离度`, r.`回本风险等级`, r.`标杆门店标志`,\n  f.`数据快照日期`\nFROM input1 f\nLEFT JOIN input2 r\n  ON f.`门店ID` = r.`门店ID`\n AND f.`数据快照日期` = r.`数据快照日期`\n```\n\n\n### 节点5\n- Id: id_1779346227913\n- Name: dws_单店利润月汇总\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n- Position: (227,64)\n- InputDsId: l6ee75fc812be413583215e4\n- DisplayType: DATAFLOW\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点6\n- Id: id_1779346227914\n- Name: dwd_加盟合同明细\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227917 (franchise_profit+同城同店型同侪)\n- Position: (227,232)\n- InputDsId: w55d0570b98a143579807416\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点7\n- Id: id_1779346227915\n- Name: dim_加盟商主档\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227918 (关联加盟商信息)\n- Position: (431,232)\n- InputDsId: e620121168c3447c3abe4948\n- DisplayType: CSV\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点8\n- Id: id_1779346227916\n- Name: dws_加盟回本测算\n- Type: INPUT_DATASET\n- **Used By (Outputs):**\n  - id_1779346227919 (关联回本测算)\n- Position: (635,232)\n- InputDsId: vf66c6e915ad048c49cbcf25\n- DisplayType: DATAFLOW\n- PreviewScope: ALL\n- 等价SQL:\n```sql\nSELECT * FROM input\n```\n\n\n### 节点9\n- Id: id_1779346227917\n- Name: franchise_profit+同城同店型同侪\n- Type: SQL_SCRIPT\n- **Sources (Inputs):**\n  - id_1779346227913 (dws_单店利润月汇总)\n  - id_1779346227914 (dwd_加盟合同明细)\n\n- **Used By (Outputs):**\n  - id_1779346227918 (关联加盟商信息)\n- Position: (431,64)\n- SqlScript:\n```sql\nWITH franchise_profit_ranked AS (\n  SELECT\n    p.*, c.`加盟商ID`, c.`签约日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY p.`门店ID`, p.`月份`\n      ORDER BY c.`签约日期` DESC, c.`合同ID` DESC\n    ) AS contract_rn\n  FROM input1 p\n  JOIN input2 c\n    ON p.`门店ID` = c.`门店ID`\n   AND CAST(CONCAT(p.`月份`, '-01') AS DATE) BETWEEN c.`签约日期`\n                                                   AND COALESCE(c.`到期日`, DATE '9999-12-31')\n   AND c.`合同状态` <> '已作废'\n),\nfranchise_profit AS (\n  SELECT * FROM franchise_profit_ranked WHERE contract_rn = 1\n),\npeer_baseline AS (\n  SELECT\n    `城市层级`, `门店类型`, `月份`,\n    PERCENTILE_APPROX(`月营收`, 0.25) AS `城市同店型_营收_P25`,\n    PERCENTILE_APPROX(`月营收`, 0.50) AS `城市同店型_营收_中位数`,\n    PERCENTILE_APPROX(`月营收`, 0.75) AS `城市同店型_营收_P75`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.25) AS `城市同店型_利润率_P25`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.50) AS `城市同店型_利润率_中位数`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.75) AS `城市同店型_利润率_P75`,\n    PERCENTILE_APPROX(`堂食占比`, 0.50) AS `城市同店型_堂食占比_中位数`,\n    COUNT(*) AS `同侪门店数`\n  FROM franchise_profit\n  GROUP BY `城市层级`, `门店类型`, `月份`\n)\nSELECT\n  s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`门店类型`, s.`商圈`,\n  s.`加盟商ID`, s.`签约日期`, s.`数据快照日期`,\n  s.`月份`, s.`月营收`, s.`堂食营收`, s.`外卖营收`, s.`订单数`,\n  s.`毛利`, s.`店面贡献利润`, s.`单店净利润`,\n  s.`毛利率`, s.`店面贡献利润率`, s.`堂食占比`, s.`外卖占比`,\n  s.`人工占比`, s.`房租占比`, s.`客单价`,\n  b.`同侪门店数`,\n  b.`城市同店型_营收_P25`, b.`城市同店型_营收_中位数`, b.`城市同店型_营收_P75`,\n  b.`城市同店型_利润率_P25`, b.`城市同店型_利润率_中位数`, b.`城市同店型_利润率_P75`,\n  b.`城市同店型_堂食占比_中位数`,\n  CASE WHEN b.`城市同店型_营收_中位数` > 0\n       THEN s.`月营收` / b.`城市同店型_营收_中位数`\n       ELSE 1 END AS `营收_对中位数比`,\n  s.`店面贡献利润率` - b.`城市同店型_利润率_中位数` AS `利润率_对中位数差`,\n  s.`堂食占比` - b.`城市同店型_堂食占比_中位数` AS `堂食占比_对中位数差`\nFROM franchise_profit s\nLEFT JOIN peer_baseline b ON s.`城市层级` = b.`城市层级` AND s.`门店类型` = b.`门店类型` AND s.`月份` = b.`月份`\n```\n- 等价SQL:\n```sql\nWITH franchise_profit_ranked AS (\n  SELECT\n    p.*, c.`加盟商ID`, c.`签约日期`,\n    ROW_NUMBER() OVER (\n      PARTITION BY p.`门店ID`, p.`月份`\n      ORDER BY c.`签约日期` DESC, c.`合同ID` DESC\n    ) AS contract_rn\n  FROM input1 p\n  JOIN input2 c\n    ON p.`门店ID` = c.`门店ID`\n   AND CAST(CONCAT(p.`月份`, '-01') AS DATE) BETWEEN c.`签约日期`\n                                                   AND COALESCE(c.`到期日`, DATE '9999-12-31')\n   AND c.`合同状态` <> '已作废'\n),\nfranchise_profit AS (\n  SELECT * FROM franchise_profit_ranked WHERE contract_rn = 1\n),\npeer_baseline AS (\n  SELECT\n    `城市层级`, `门店类型`, `月份`,\n    PERCENTILE_APPROX(`月营收`, 0.25) AS `城市同店型_营收_P25`,\n    PERCENTILE_APPROX(`月营收`, 0.50) AS `城市同店型_营收_中位数`,\n    PERCENTILE_APPROX(`月营收`, 0.75) AS `城市同店型_营收_P75`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.25) AS `城市同店型_利润率_P25`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.50) AS `城市同店型_利润率_中位数`,\n    PERCENTILE_APPROX(`店面贡献利润率`, 0.75) AS `城市同店型_利润率_P75`,\n    PERCENTILE_APPROX(`堂食占比`, 0.50) AS `城市同店型_堂食占比_中位数`,\n    COUNT(*) AS `同侪门店数`\n  FROM franchise_profit\n  GROUP BY `城市层级`, `门店类型`, `月份`\n)\nSELECT\n  s.`门店ID`, s.`门店名称`, s.`省份`, s.`城市`, s.`城市层级`, s.`门店类型`, s.`商圈`,\n  s.`加盟商ID`, s.`签约日期`, s.`数据快照日期`,\n  s.`月份`, s.`月营收`, s.`堂食营收`, s.`外卖营收`, s.`订单数`,\n  s.`毛利`, s.`店面贡献利润`, s.`单店净利润`,\n  s.`毛利率`, s.`店面贡献利润率`, s.`堂食占比`, s.`外卖占比`,\n  s.`人工占比`, s.`房租占比`, s.`客单价`,\n  b.`同侪门店数`,\n  b.`城市同店型_营收_P25`, b.`城市同店型_营收_中位数`, b.`城市同店型_营收_P75`,\n  b.`城市同店型_利润率_P25`, b.`城市同店型_利润率_中位数`, b.`城市同店型_利润率_P75`,\n  b.`城市同店型_堂食占比_中位数`,\n  CASE WHEN b.`城市同店型_营收_中位数` > 0\n       THEN s.`月营收` / b.`城市同店型_营收_中位数`\n       ELSE 1 END AS `营收_对中位数比`,\n  s.`店面贡献利润率` - b.`城市同店型_利润率_中位数` AS `利润率_对中位数差`,\n  s.`堂食占比` - b.`城市同店型_堂食占比_中位数` AS `堂食占比_对中位数差`\nFROM franchise_profit s\nLEFT JOIN peer_baseline b ON s.`城市层级` = b.`城市层级` AND s.`门店类型` = b.`门店类型` AND s.`月份` = b.`月份`\n```\n\n\n---\n\n## 血缘关系\n\n### 上游资源 (4)\n- **dim_加盟商主档** (DATA_SET_FILE)\n  - ID: e620121168c3447c3abe4948\n- **dwd_加盟合同明细** (DATA_SET_FILE)\n  - ID: w55d0570b98a143579807416\n- **dws_单店利润月汇总** (DATA_SET_ETL)\n  - ID: l6ee75fc812be413583215e4\n- **dws_加盟回本测算** (DATA_SET_ETL)\n  - ID: vf66c6e915ad048c49cbcf25\n\n### 下游资源 (1)\n- **ads_加盟商单店报告** (DATA_SET_ETL)\n  - ID: n7e1bd96a3dcf48e88f18022\n\nArchive v1.3.2: 113 files, 248310 bytes\n\nFiles: AGENTS.md (4713b), ETL/逻辑SQL/ads_会员私域驾驶舱.md (5374b), ETL/逻辑SQL/ads_会员经营任务池.md (5672b), ETL/逻辑SQL/ads_门店每日指挥台.md (9239b), ETL/逻辑SQL/ads_高层经营驾驶舱.md (5492b), ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md (10246b), ETL/逻辑SQL/etl_ads_单店利润健康 (6节点·J+C+S).md (6368b), ETL/逻辑SQL/etl_ads_异常归因清单.md (20132b), ETL/逻辑SQL/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).md (8454b), ETL/逻辑SQL/etl_dqc_归因清单对账.md (11969b), ETL/逻辑SQL/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).md (6973b), ETL/逻辑SQL/etl_dws_会员同期群留存.md (5118b), ETL/逻辑SQL/etl_dws_会员生命周期.md (6379b), ETL/逻辑SQL/etl_dws_体验口碑汇总.md (6522b), ETL/逻辑SQL/etl_dws_券效益分析.md (5433b), ETL/逻辑SQL/etl_dws_加盟商经营汇总 (7节点·S+J+C).md (6526b), ETL/逻辑SQL/etl_dws_加盟回本测算 (9节点·S×3+J+C).md (9076b), ETL/逻辑SQL/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).md (10802b), ETL/逻辑SQL/etl_dws_员工导购效能 (8节点·F+S+J+C).md (7086b), ETL/逻辑SQL/etl_dws_商品销售分析.md (4923b), ETL/逻辑SQL/etl_dws_成本结构汇总 (7节点·J+S+C).md (4687b), ETL/逻辑SQL/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).md (4927b), ETL/逻辑SQL/etl_dws_渠道迁移分析.md (6415b), ETL/逻辑SQL/etl_dws_目标达成.md (5047b), ETL/逻辑SQL/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).md (5300b), ETL/逻辑SQL/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).md (7214b), LICENSE.md (1097b), llms.txt (2529b), README.en.md (5419b), README.md (17884b), skill-card.md (2940b), SKILL.md (6965b), 公式库/01-date-and-time.md (7423b), 公式库/02-customer-and-membership.md (27093b), 公式库/03-revenue-kpi.md (7296b), 公式库/04-channel-and-store.md (17694b), 公式库/05-coupon-and-discount.md (5520b), 公式库/06-sql-utils.md (10598b), 公式库/07-data-quality-traps.md (8942b), 公式库/08-etl-engineering-patterns.md (14943b), 公式库/09-etl-catalog.md (14188b), 公式库/README.md (5409b), 分享/区域运营的一天/README.md (15682b), 数据集/结构定义/ads_会员私域驾驶舱.md (3244b), 数据集/结构定义/ads_会员经营任务池.md (6950b), 数据集/结构定义/ads_加盟商单店报告.md (10679b), 数据集/结构定义/ads_单店利润健康.md (8061b), 数据集/结构定义/ads_异常归因清单.md (4027b), 数据集/结构定义/ads_活动权益复盘.md (4318b), 数据集/结构定义/ads_门店每日指挥台.md (5671b), 数据集/结构定义/ads_高层经营驾驶舱.md (3380b), 数据集/结构定义/dim_会员主档.md (3853b), 数据集/结构定义/dim_会员身份桥.md (3664b), 数据集/结构定义/dim_券模板.md (2804b), 数据集/结构定义/dim_加盟商主档.md (3331b), 数据集/结构定义/dim_员工导购.md (2733b), 数据集/结构定义/dim_商品主档.md (3339b), 数据集/结构定义/dim_成本科目.md (2447b), 数据集/结构定义/dim_日期.md (3309b), 数据集/结构定义/dim_活动主档.md (3083b), 数据集/结构定义/dim_门店主档.md (7075b), 数据集/结构定义/dqc_归因清单对账.md (2283b), 数据集/结构定义/dwd_会员注册绑定.md (2539b), 数据集/结构定义/dwd_会员经营任务.md (5104b), 数据集/结构定义/dwd_会员触达.md (3669b), 数据集/结构定义/dwd_券事件.md (3359b), 数据集/结构定义/dwd_加盟分账明细.md (3678b), 数据集/结构定义/dwd_加盟合同明细.md (4649b), 数据集/结构定义/dwd_投诉.md (2801b), 数据集/结构定义/dwd_活动参与.md (2362b), 数据集/结构定义/dwd_私域事件.md (2860b), 数据集/结构定义/dwd_积分事件.md (2533b), 数据集/结构定义/dwd_订单.md (6005b), 数据集/结构定义/dwd_订单商品.md (2473b), 数据集/结构定义/dwd_评价.md (3224b), 数据集/结构定义/dwd_门店成本明细.md (3512b), 数据集/结构定义/dwd_门店投资明细.md (2694b), 数据集/结构定义/dwd_门店目标.md (2118b), 数据集/结构定义/dws_会员RFM分层.md (3563b), 数据集/结构定义/dws_会员同期群留存.md (1814b)\n\nFile v1.3.2:SKILL.md\n\n---\nname: majia-huiyuan\ndescription: \"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。只有出现“数据、指标、公式、怎么算、SQL、表、看板、核验”等明确信号时才处理私域问题。若用户要朋友圈、群发、欢迎语、社群触达、企微运营动作、私域整盘经营诊断或任务下一步，不要触发本 Skill，改用 majia-siyu。全部数值为模拟数据，仅结构与口径可引用。\"\nlicense: MIT\nmetadata:\n  version: \"1.3.2\"\n  author: \"超级马甲 / maojiebc\"\n  homepage: https://github.com/maojiebc/majia-huiyuan\n  openclaw:\n    emoji: \"🪪\"\n    homepage: https://github.com/maojiebc/majia-huiyuan\n---\n\n# 会员运营 · 马甲实战版\n\n你装上的是一套**开源会员运营家底**：一个可照抄的连锁会员数据中台样板间 + 一座口径公式库 + 一份方法论实录。你的角色是**会员数据顾问**——用户大概率是业务或数据分析背景，不是工程师：先人话，后术语；每个结论给出处路径。\n\n## 功能架构\n\n一图看全：三大资产 → 五层数仓 → 会员数据顾问能干的八类活。\n\n![majia-huiyuan 功能架构](https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png)\n\n## 三大资产\n\n> SkillHub 为文本精简包：保留结构定义、ETL 逻辑、看板文档、公式库与方法论正文；数据样本、原始 JSON 和图片请从 GitHub 完整版读取。\n\n| 资产 | 位置 | 是什么 |\n|---|---|---|\n| **样板间** | `数据集/` `ETL/` `看板/` `清单/` | 咖啡连锁模拟中台整库：54 数据集（DIM10/DWD16/DWS16/ADS8/DQC1/param3）、25 条 ETL、12 张角色看板。每个资产三形态：`结构定义/*.md`（字段结构，最适合直接读）、`数据样本/*.csv`（200 行模拟样本，表头即 schema）、`原始JSON/*.json`（观远平台定义，仅复刻用） |\n| **公式库** | `公式库/` | 9 册约 2900 行，蒸馏自真实履职（已脱敏）：复购 / RFM / 核销 / 留存流失的标准 SQL、通用字段词典、数据质量三态坑、DWD 宽表范式、39 生产 ETL 索引。总入口 `公式库/README.md`（路由表 + 5 条最易踩的坑） |\n| **方法论实录** | `分享/区域运营的一天/README.md` | 获奖直播书面实录（34 页插画）：区域运营痛点 → AI 跑五步人拍板 → 可信四件套 → 三案例（归因到人 / 会闭嘴 / 会多看一眼）→ 四类人落地 FAQ |\n\n## 任务路由（用户要 X → 你做 Y）\n\n| 用户要什么 | 你怎么干 |\n|---|---|\n| **问口径 / 公式**（\"复购怎么算\"\"RFM 怎么分层\"\"核销率口径\"） | 先查 `公式库/README.md` 路由表进对应分册拿标准 SQL；再对照 `ETL/逻辑SQL/` 里样板间的实际实现，两处一致时置信度最高。**必须提口径选项**（如复购跨天 vs 非跨天是两条曲线），让用户自己选 |\n| **从零设计会员数据体系** | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 分阶段给**最小可用集**：先档案（会员主档/门店主档）+ 订单流水，再算汇总（RFM/生命周期），再上报表。绝不一次吐 54 张表 |\n| **诊断现有体系缺什么** | 把 54 个数据集当 checklist，逐层对照用户已有的表，输出缺口清单 + 补齐优先级（优先补影响口径的 DIM 和 param） |\n| **生成建表语句** | 用 `数据集/结构定义/*.md` 的字段与类型信息推 schema；需要取值样本时读取 GitHub 完整版的 `数据集/数据样本/*.csv`，翻译成用户的目标引擎方言（源是 Spark 3.4，MySQL/ClickHouse/PG 注意函数差异并主动提醒） |\n| **规划看板体系** | 参照 12 张角色看板（`看板/页面文档/`）：老板看驾驶舱、会员负责人看私域盘、店长看每日指挥台、加盟商看单店报告——按用户组织架构裁剪，每个角色一张 |\n| **数据质量排障**（\"两套数对不上\"\"AI 老搞混字段\"） | 查 `公式库/07-data-quality-traps.md`：NULL/空串/'null' 三态、字段重名打括号重命名、口径歧义对照表；对账思路参照 `dqc_归因清单对账` 的九项自检设计 |\n| **讲解方法论 / 做内训素材** | 用 `分享/区域运营的一天/README.md` 的叙事：五步动作链、可信四件套（param 参数表/归因清单唯一出口/dqc 对账/P0 护栏）、\"误报比漏报贵\"\"让 AI 学会闭嘴\"。引用案例时注明数据为模拟 |\n| **复刻整套到观远 BI** | `*/原始JSON/` + 官方全家桶 `npm i -g @guandata/guanskill`（guancli/guanetl/guands/guanvis）；平台级操作细节与踩坑切到兄弟 skill **majia-guanyuan** |\n\n## 硬约束（违反会误导用户）\n\n1. **数据是模拟的**：结构、字段、口径、设计思路随便引用；**数值绝不可**当真实经营数据或行业基准。\n2. **口径先行**：凡涉及复购/留存/频次类指标，先确认口径再给公式——口径不统一时，算得越快错得越快。\n3. **SQL 是 Spark 3.4 方言**：跨引擎主动提醒函数差异。\n4. **引用带路径**：给用户的每个结论标注来源文件相对路径。\n5. **ID 不可移植**：原始 JSON 里的资源 ID 是 workshop 实例私有的。\n\n更多命名约定与文件形态说明见 [AGENTS.md](AGENTS.md)；机器可读索引见 [llms.txt](llms.txt)。\n\n> 📦 **完整版以 GitHub 为准**：若你通过 ClawHub / npm 安装的包里缺插画图片或 `*/原始JSON/`（发布包可能瘦身），`git clone https://github.com/maojiebc/majia-huiyuan` 取完整版；\"复刻整套到观远\"路由必须用完整版。\n\n## 与兄弟 skill 的分工\n\n- **majia-huiyuan（本 skill）**：会员运营的数据与公式——体系怎么设计、口径怎么算、看板给谁看。**平台无关。**\n- **[majia-siyu](https://github.com/maojiebc/majia-siyu-team)**：私域经营动作——朋友圈、群发、欢迎语、社群触达、企微运营和整盘经营诊断。\n- **[majia-guanyuan](https://github.com/maojiebc/majia-guanyuan)**：观远 BI 平台的工具与踩坑——ETL 治理、报错手册、自定义图表注入、发布状态机。用户在观远平台上动手时切过去。\n\n## 📋 版本记录\n\n- **v1.3.2**（2026-07-28）触发边界修复：聚焦会员数据、指标、SQL、数仓与看板；私域内容、触达和经营动作明确交给 majia-siyu。\n- **v1.3.1**（2026-07-23）文档装修：功能架构图 + README.en.md + 品牌后缀落地，内容零改动。\n- **v1.3.0**（2026-07-12）Skill 化：SKILL.md + manifest.json 进仓库，顾问型八类活任务路由。\n\n完整历史见 [GitHub Releases](https://github.com/maojiebc/majia-huiyuan/releases)。\n\nFile v1.3.2:README.md\n\n# majia-huiyuan · 会员运营家底（开源样板间）\n\n[![Skill Version](https://img.shields.io/badge/skill-v1.3.2-blue)](./SKILL.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n[![skills.sh](https://skills.sh/b/maojiebc/majia-huiyuan)](https://skills.sh/maojiebc/majia-huiyuan)\n[![Release](https://img.shields.io/github/v/release/maojiebc/majia-huiyuan?label=release&color=success)](https://github.com/maojiebc/majia-huiyuan/releases)\n[![AI Agent Friendly](https://img.shields.io/badge/AI_Agent-friendly-1abc9c)](./AGENTS.md)\n[![Data](https://img.shields.io/badge/%E6%95%B0%E6%8D%AE-%E5%85%A8%E6%A8%A1%E6%8B%9F%E7%94%9F%E6%88%90-orange)](#数据说明必读)\n\n> **会员运营 · 马甲实战版** — 一套**完整的、可以照着抄的**连锁会员数据体系。以一家虚构的咖啡连锁为例，从会员注册的第一行数据，到老板看的经营驾驶舱：**54 个数据集、25 条数据加工链、12 张看板，外加约 2900 行的实战公式库**，全部摊开。\n>\n> 数据全部模拟生成，与任何真实企业无关。MIT 协议，个人用、公司用、商用，都随便。\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png\" width=\"440\" alt=\"majia-huiyuan v1.3.2 功能架构：三大资产 + 五层数仓 + 会员数据顾问八类活 + 与 majia-siyu（私域经营动作）及 majia-guanyuan（平台工具）的分工\"/>\n</p>\n\n**谁适合看**：做会员、做私域的业务同学；做数据分析、数据建设的同学；想给自己公司从零搭一套会员数据体系的人。**不需要会写代码。**\n\n**AI 也适合看**：如果你是 AI Agent（WorkBuddy / Claude / Codex / Cursor …），你的入口在 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md)；本仓库同时是一个可安装的 **Agent Skill**（[SKILL.md](./SKILL.md)），装法见[下方](#-当-agent-skill-用)。\n\n---\n\n## 这是什么\n\n会员运营这行有块三不管地带：字段怎么定义、口径怎么算、看板怎么搭，做业务的嫌它是技术细节，做数据的嫌它是业务琐事，两边都懂的人当它是吃饭本事。结果就是，想学的人找不到一份能从头看到尾的完整参照。\n\n这个仓库就是那份参照——一个\"样板间\"。\n\n它是 2026 年 5 月在观远 BI 官方 workshop 实例上独立搭建的一套完整会员数据中台，虚构了一家咖啡连锁：**8 万会员、1200 家门店、141 个加盟商、74 个商品、129 万笔订单**。麻雀不大，五脏俱全：会员注册、订单、发券、积分、私域触达、投诉评价、加盟分账、门店成本，全链路的数据都有，而且是打通的。\n\n毛坯房教不会人装修，样板间可以。你不一定照单全收，但每面墙长什么样、水电怎么走，这里都看得见。\n\n本仓库会持续迭代，路线图见[下方](#路线图)。\n\n## 三分钟看懂：数据分五层\n\n所有数据集按五层组织（这是数据行业的通用做法，名字唬人，事情简单）：\n\n| 层 | 行话 | 人话 | 本库数量 |\n|---|---|---|---|\n| **DIM** | 维度层 | **档案柜**：会员档案、门店档案、商品档案，一行 = 一个人 / 一家店 / 一件商品 | 10 |\n| **DWD** | 明细层 | **流水账**：每笔订单、每次发券、每条评价，一行 = 发生过的一件事 | 16 |\n| **DWS** | 汇总层 | **台账**：把流水按人、按店、按月归拢，复购率、RFM 分层都在这层算出来 | 16 |\n| **ADS** | 应用层 | **驾驶舱**：老板、店长、运营直接看的最终报表 | 8 |\n| **DQC** | 质检层 | **质检员**：两套数对不上时，先来这层查 | 1 |\n| param | 参数表 | 阈值配置（比如\"几天没来算流失\"，写在表里而不是写死在公式里） | 3 |\n\n数据的流向一句话：**档案柜 + 流水账 →（25 条加工链）→ 台账 → 驾驶舱**。\n\n## 资产地图（54 个数据集）\n\n每个数据集一句人话。字段级明细看 [数据集/结构定义/](./数据集/结构定义/)，长什么样看 [数据集/数据样本/](./数据集/数据样本/)。\n\n### DIM 档案柜（10）\n\n| 数据集 | 一句话 |\n|---|---|\n| dim_会员主档 | 每个会员一行：等级、注册渠道、城市、状态（8 万行） |\n| dim_会员身份桥 | 一个人的多个身份（手机号 / 微信 / 支付宝）怎么认成同一个人 |\n| dim_门店主档 | 每家店一行：城市、店型、开业日期（1200 家） |\n| dim_加盟商主档 | 每个加盟商一行（141 个） |\n| dim_商品主档 | 每个商品一行：品类、价格带（74 个） |\n| dim_券模板 | 每种券一行：面额、门槛、有效期 |\n| dim_活动主档 | 每场营销活动一行 |\n| dim_员工导购 | 每个店员 / 导购一行 |\n| dim_成本科目 | 房租、人力、原料……成本怎么分类 |\n| dim_日期 | 日期维表：节假日、周末、月份归属 |\n\n### DWD 流水账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dwd_订单 | 每笔订单一行：金额、渠道、是否会员、是否用券（129 万行） |\n| dwd_订单商品 | 订单里的每件商品一行 |\n| dwd_会员注册绑定 | 每次注册 / 绑定一行 |\n| dwd_券事件 | 每张券的发放、核销、过期 |\n| dwd_积分事件 | 每笔积分的挣与花 |\n| dwd_会员触达 | 每次触达一行：短信 / 企微 / Push，发给谁、谁打开（50 万行） |\n| dwd_私域事件 | 进群、退群、加好友、会话 |\n| dwd_活动参与 | 谁参加了哪场活动 |\n| dwd_评价 | 每条顾客评价 |\n| dwd_投诉 | 每条投诉 |\n| dwd_会员经营任务 | 总部派给门店的会员任务及完成情况 |\n| dwd_加盟合同明细 | 每份加盟合同 |\n| dwd_加盟分账明细 | 每笔加盟分账 |\n| dwd_门店成本明细 | 每笔门店成本 |\n| dwd_门店投资明细 | 每笔开店投资 |\n| dwd_门店目标 | 每店每期的目标值 |\n\n### DWS 台账（16）\n\n| 数据集 | 一句话 |\n|---|---|\n| dws_会员RFM分层 | 每个会员的 R / F / M 打分和分层标签（做精准营销的底座） |\n| dws_会员生命周期 | 新客 / 活跃 / 沉睡 / 流失，每人当前在哪一段 |\n| dws_会员同期群留存 | 按注册月份分组，看每批人第 N 月还剩多少（Cohort 留存） |\n| dws_私域转化漏斗 | 触达 → 查看 → 下单，每场活动的漏斗和转化率 |\n| dws_券效益分析 | 每种券花了多少、带回多少 |\n| dws_渠道迁移分析 | 顾客在堂食 / 外卖 / 小程序之间怎么流动 |\n| dws_商品销售分析 | 每个商品卖得怎么样 |\n| dws_门店日报 | 每店每天的核心经营数 |\n| dws_目标达成 | 每店目标完成进度 |\n| dws_新店爬坡_Comp老店 | 新店爬坡曲线，和可比老店（Comp）对照 |\n| dws_单店利润月汇总 | 每店每月的利润账 |\n| dws_成本结构汇总 | 成本按科目的构成 |\n| dws_加盟商经营汇总 | 每个加盟商名下门店的经营汇总 |\n| dws_加盟回本测算 | 每家加盟店投了多少、回了多少、预计几个月回本、风险等级 |\n| dws_员工导购效能 | 每个导购拉新、复购带动的效能 |\n| dws_体验口碑汇总 | 评价、投诉汇总成门店体验分 |\n\n### ADS 驾驶舱（8）\n\n| 数据集 | 一句话 |\n|---|---|\n| ads_高层经营驾驶舱 | 给老板：大盘营收、会员贡献、风险信号 |\n| ads_会员私域驾驶舱 | 给会员负责人：活跃、新增、触达、会员销售占比 |\n| ads_会员经营任务池 | 给运营：待办的会员经营任务清单 |\n| ads_门店每日指挥台 | 给店长：今天该看的数、该做的事 |\n| ads_活动权益复盘 | 给营销：每场活动的投入产出复盘 |\n| ads_单店利润健康 | 给财务 / 拓展：每店利润健康度 |\n| ads_加盟商单店报告 | 给加盟商：他自己店的经营报告 |\n| ads_异常归因清单 | 数据异动的归因线索清单 |\n\n### DQC 质检 + param 参数（4）\n\n| 数据集 | 一句话 |\n|---|---|\n| dqc_归因清单对账 | 两条链路算同一个数，对不上就报警 |\n| param_会员生命周期阈值 | 几天算沉睡、几天算流失，阈值配置 |\n| param_利润健康阈值 | 利润健康度的分档线 |\n| param_豁免日历 | 大促 / 特殊日期豁免名单（防止误判异常） |\n\n## 12 张看板\n\n从老板到店长到加盟商，每个角色一张自己的报表。清单见 [清单/看板清单.csv](./清单/看板清单.csv)，每张的卡片明细在 [看板/页面文档/](./看板/页面文档/)。\n\n01 高层经营驾驶舱 · 02 会员私域驾驶舱 · 03 会员经营任务池 · 04 门店每日指挥台 · 05 活动权益复盘 · 06 体验风险专题 · 07 单店利润健康 · 08 加盟商单店报告 · 09 总览（ECharts 重构版）· 10 异常归因作战页 · 外卖业绩近 30 天 GMV · 参赛作品提交页\n\n## 公式库（60+ 段可直接抄的 SQL）\n\n样板间给你看结构，公式库给你抄算法。[公式库/](./公式库/) 蒸馏自两段连锁餐饮 BI 实战履职（已全脱敏，约 2900 行），2026-07-12 从 majia-guanyuan 迁入本仓库统一维护，按主题分 9 册：\n\n| 分册 | 管什么 |\n|---|---|\n| [01 日期与时间](./公式库/01-date-and-time.md) | T-1、本月、近 N 天、用餐时段、跨月对齐、观远时间宏 |\n| [02 顾客与会员](./公式库/02-customer-and-membership.md) | 新老客、消费频次 3 口径、复购（跨天 vs 非跨天）、RFM 8 类 × 营销策略、留存流失 |\n| [03 营收 KPI](./公式库/03-revenue-kpi.md) | 客单价 AC、ADS、ADT、Comp 同店、会员贡献占比 |\n| [04 渠道与门店](./公式库/04-channel-and-store.md) | 堂食外卖分流、门店生命周期、多渠道评价 pipeline |\n| [05 券与折扣](./公式库/05-coupon-and-discount.md) | 核销率、折扣率、折扣分桶、注册首张券 |\n| [06 SQL 工具箱](./公式库/06-sql-utils.md) | 字符串拆解、开窗排名、累计窗口 |\n| [07 数据质量坑](./公式库/07-data-quality-traps.md) | NULL / 空串 / 'null' 三态、口径歧义、通用字段词典 |\n| [08 ETL 工程范式](./公式库/08-etl-engineering-patterns.md) | DWD 宽表底座、财务双源对账、POS 归一化、Cohort 网格 |\n| [09 生产 ETL 索引](./公式库/09-etl-catalog.md) | 39 个生产 ETL 按 11 个业务域的索引与复用决策表 |\n\n总入口和\"5 条最容易踩的坑\"见 [公式库/README.md](./公式库/README.md)。**样板间的表结构 + 公式库的算法，两样凑齐，就是能开工的图纸。**\n\n## 一场直播，把这套东西讲了一遍\n\n2026 年 7 月，这套体系的设计思路在观远「对话 AI Hero」直播里完整讲过一次（AI 创新赛一等奖作品《区域运营的一天》）：区域运营一上午的巡店分析，AI 怎么压缩到几分钟，怎么归因到人、怎么学会闭嘴、怎么多看一眼。\n\n**[📖 分享/区域运营的一天/](./分享/区域运营的一天/README.md)** —— 34 页插画板全嵌的书面实录，当时演示的数据环境就是本仓库。想先看故事再翻表的，从这里进。\n\n## 目录结构（怎么翻）\n\n```\n清单/          三张总清单 CSV（数据集 / ETL / 看板，含 ID）——先看这里拿全景\n公式库/        餐饮 BI 公式实战库（README + 9 册）★ 算法和口径 SQL 都在这\n分享/          直播分享书面实录（34 页插画长文）★ 想先看故事的从这进\n数据集/\n  结构定义/    每个数据集的字段结构说明 ★ 最值得先看\n  数据样本/    每个数据集 200 行模拟样本 CSV，字段长什么样一目了然\n  原始JSON/    观远平台原始定义（整套复刻时用）\nETL/\n  逻辑SQL/     25 条加工链的节点结构和 SQL 逻辑 ★ 口径都在这\n  原始JSON/    平台原始定义（复刻用）\n看板/\n  页面文档/    每张看板放了哪些卡片、各是什么\n  页面\n\nArchive v1.3.1: 313 files, 1100509 bytes\n\nFiles: AGENTS.md (4713b), docs/architecture.svg (8163b), ETL/原始JSON/ads_会员私域驾驶舱.json (14285b), ETL/原始JSON/ads_会员经营任务池.json (23943b), ETL/原始JSON/ads_门店每日指挥台.json (24129b), ETL/原始JSON/ads_高层经营驾驶舱.json (14445b), ETL/原始JSON/etl_ads_加盟商单店报告 (9节点·S+J×2+C).json (47615b), ETL/原始JSON/etl_ads_单店利润健康 (6节点·J+C+S).json (28629b), ETL/原始JSON/etl_ads_异常归因清单.json (41072b), ETL/原始JSON/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).json (32076b), ETL/原始JSON/etl_dqc_归因清单对账.json (30337b), ETL/原始JSON/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).json (21423b), ETL/原始JSON/etl_dws_会员同期群留存.json (12821b), ETL/原始JSON/etl_dws_会员生命周期.json (16198b), ETL/原始JSON/etl_dws_体验口碑汇总.json (19239b), ETL/原始JSON/etl_dws_券效益分析.json (16124b), ETL/原始JSON/etl_dws_加盟商经营汇总 (7节点·S+J+C).json (25578b), ETL/原始JSON/etl_dws_加盟回本测算 (9节点·S×3+J+C).json (31020b), ETL/原始JSON/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).json (37492b), ETL/原始JSON/etl_dws_员工导购效能 (8节点·F+S+J+C).json (20553b), ETL/原始JSON/etl_dws_商品销售分析.json (19569b), ETL/原始JSON/etl_dws_成本结构汇总 (7节点·J+S+C).json (17628b), ETL/原始JSON/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).json (19628b), ETL/原始JSON/etl_dws_渠道迁移分析.json (15063b), ETL/原始JSON/etl_dws_目标达成.json (12645b), ETL/原始JSON/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).json (18708b), ETL/原始JSON/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).json (29252b), ETL/逻辑SQL/ads_会员私域驾驶舱.md (5374b), ETL/逻辑SQL/ads_会员经营任务池.md (5672b), ETL/逻辑SQL/ads_门店每日指挥台.md (9239b), ETL/逻辑SQL/ads_高层经营驾驶舱.md (5492b), ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md (10246b), ETL/逻辑SQL/etl_ads_单店利润健康 (6节点·J+C+S).md (6368b), ETL/逻辑SQL/etl_ads_异常归因清单.md (20132b), ETL/逻辑SQL/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).md (8454b), ETL/逻辑SQL/etl_dqc_归因清单对账.md (11969b), ETL/逻辑SQL/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).md (6973b), ETL/逻辑SQL/etl_dws_会员同期群留存.md (5118b), ETL/逻辑SQL/etl_dws_会员生命周期.md (6379b), ETL/逻辑SQL/etl_dws_体验口碑汇总.md (6522b), ETL/逻辑SQL/etl_dws_券效益分析.md (5433b), ETL/逻辑SQL/etl_dws_加盟商经营汇总 (7节点·S+J+C).md (6526b), ETL/逻辑SQL/etl_dws_加盟回本测算 (9节点·S×3+J+C).md (9076b), ETL/逻辑SQL/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).md (10802b), ETL/逻辑SQL/etl_dws_员工导购效能 (8节点·F+S+J+C).md (7086b), ETL/逻辑SQL/etl_dws_商品销售分析.md (4923b), ETL/逻辑SQL/etl_dws_成本结构汇总 (7节点·J+S+C).md (4687b), ETL/逻辑SQL/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).md (4927b), ETL/逻辑SQL/etl_dws_渠道迁移分析.md (6415b), ETL/逻辑SQL/etl_dws_目标达成.md (5047b), ETL/逻辑SQL/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).md (5300b), ETL/逻辑SQL/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).md (7214b), LICENSE (1097b), llms.txt (2529b), manifest.json (1640b), README.en.md (4789b), README.md (17876b), skill-card.md (3131b), SKILL.md (7526b), 公式库/01-date-and-time.md (7423b), 公式库/02-customer-and-membership.md (27093b), 公式库/03-revenue-kpi.md (7296b), 公式库/04-channel-and-store.md (17694b), 公式库/05-coupon-and-discount.md (5520b), 公式库/06-sql-utils.md (10598b), 公式库/07-data-quality-traps.md (8942b), 公式库/08-etl-engineering-patterns.md (14943b), 公式库/09-etl-catalog.md (14188b), 公式库/README.md (5409b), 分享/区域运营的一天/README.md (15682b), 数据集/原始JSON/ads_会员私域驾驶舱.json (6599b), 数据集/原始JSON/ads_会员经营任务池.json (14645b), 数据集/原始JSON/ads_加盟商单店报告.json (20825b), 数据集/原始JSON/ads_单店利润健康.json (14968b), 数据集/原始JSON/ads_异常归因清单.json (11124b), 数据集/原始JSON/ads_活动权益复盘.json (10012b), 数据集/原始JSON/ads_门店每日指挥台.json (11444b), 数据集/原始JSON/ads_高层经营驾驶舱.json (6710b), 数据集/原始JSON/dim_会员主档.json (5848b), 数据集/原始JSON/dim_会员身份桥.json (5711b)\n\nArchive v1.3.0: 310 files, 1093704 bytes\n\nFiles: AGENTS.md (4713b), ETL/原始JSON/ads_会员私域驾驶舱.json (14285b), ETL/原始JSON/ads_会员经营任务池.json (23943b), ETL/原始JSON/ads_门店每日指挥台.json (24129b), ETL/原始JSON/ads_高层经营驾驶舱.json (14445b), ETL/原始JSON/etl_ads_加盟商单店报告 (9节点·S+J×2+C).json (47615b), ETL/原始JSON/etl_ads_单店利润健康 (6节点·J+C+S).json (28629b), ETL/原始JSON/etl_ads_异常归因清单.json (41072b), ETL/原始JSON/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).json (32076b), ETL/原始JSON/etl_dqc_归因清单对账.json (30337b), ETL/原始JSON/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).json (21423b), ETL/原始JSON/etl_dws_会员同期群留存.json (12821b), ETL/原始JSON/etl_dws_会员生命周期.json (16198b), ETL/原始JSON/etl_dws_体验口碑汇总.json (19239b), ETL/原始JSON/etl_dws_券效益分析.json (16124b), ETL/原始JSON/etl_dws_加盟商经营汇总 (7节点·S+J+C).json (25578b), ETL/原始JSON/etl_dws_加盟回本测算 (9节点·S×3+J+C).json (31020b), ETL/原始JSON/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).json (37492b), ETL/原始JSON/etl_dws_员工导购效能 (8节点·F+S+J+C).json (20553b), ETL/原始JSON/etl_dws_商品销售分析.json (19569b), ETL/原始JSON/etl_dws_成本结构汇总 (7节点·J+S+C).json (17628b), ETL/原始JSON/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).json (19628b), ETL/原始JSON/etl_dws_渠道迁移分析.json (15063b), ETL/原始JSON/etl_dws_目标达成.json (12645b), ETL/原始JSON/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).json (18708b), ETL/原始JSON/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).json (29252b), ETL/逻辑SQL/ads_会员私域驾驶舱.md (5374b), ETL/逻辑SQL/ads_会员经营任务池.md (5672b), ETL/逻辑SQL/ads_门店每日指挥台.md (9239b), ETL/逻辑SQL/ads_高层经营驾驶舱.md (5492b), ETL/逻辑SQL/etl_ads_加盟商单店报告 (9节点·S+J×2+C).md (10246b), ETL/逻辑SQL/etl_ads_单店利润健康 (6节点·J+C+S).md (6368b), ETL/逻辑SQL/etl_ads_异常归因清单.md (20132b), ETL/逻辑SQL/etl_ads_活动权益复盘 (17节点·C+G+F+C+G×2+S+J×3+C).md (8454b), ETL/逻辑SQL/etl_dqc_归因清单对账.md (11969b), ETL/逻辑SQL/etl_dws_会员RFM分层 (10节点·F+C+G+S+J).md (6973b), ETL/逻辑SQL/etl_dws_会员同期群留存.md (5118b), ETL/逻辑SQL/etl_dws_会员生命周期.md (6379b), ETL/逻辑SQL/etl_dws_体验口碑汇总.md (6522b), ETL/逻辑SQL/etl_dws_券效益分析.md (5433b), ETL/逻辑SQL/etl_dws_加盟商经营汇总 (7节点·S+J+C).md (6526b), ETL/逻辑SQL/etl_dws_加盟回本测算 (9节点·S×3+J+C).md (9076b), ETL/逻辑SQL/etl_dws_单店利润月汇总 (11节点·F+C+G+S×2+J+C).md (10802b), ETL/逻辑SQL/etl_dws_员工导购效能 (8节点·F+S+J+C).md (7086b), ETL/逻辑SQL/etl_dws_商品销售分析.md (4923b), ETL/逻辑SQL/etl_dws_成本结构汇总 (7节点·J+S+C).md (4687b), ETL/逻辑SQL/etl_dws_新店爬坡_Comp老店 (8节点·F+C+G+J).md (4927b), ETL/逻辑SQL/etl_dws_渠道迁移分析.md (6415b), ETL/逻辑SQL/etl_dws_目标达成.md (5047b), ETL/逻辑SQL/etl_dws_私域转化漏斗 (10节点·F+C+G+C+G+J+C).md (5300b), ETL/逻辑SQL/etl_dws_门店日报 (10节点·F+C+G+S×2+J+C).md (7214b), llms.txt (2529b), manifest.json (1640b), README.md (17089b), skill-card.md (2752b), SKILL.md (6603b), 公式库/01-date-and-time.md (7423b), 公式库/02-customer-and-membership.md (27093b), 公式库/03-revenue-kpi.md (7296b), 公式库/04-channel-and-store.md (17694b), 公式库/05-coupon-and-discount.md (5520b), 公式库/06-sql-utils.md (10598b), 公式库/07-data-quality-traps.md (8942b), 公式库/08-etl-engineering-patterns.md (14943b), 公式库/09-etl-catalog.md (14188b), 公式库/README.md (5409b), 分享/区域运营的一天/README.md (15682b), 数据集/原始JSON/ads_会员私域驾驶舱.json (6599b), 数据集/原始JSON/ads_会员经营任务池.json (14645b), 数据集/原始JSON/ads_加盟商单店报告.json (20825b), 数据集/原始JSON/ads_单店利润健康.json (14968b), 数据集/原始JSON/ads_异常归因清单.json (11124b), 数据集/原始JSON/ads_活动权益复盘.json (10012b), 数据集/原始JSON/ads_门店每日指挥台.json (11444b), 数据集/原始JSON/ads_高层经营驾驶舱.json (6710b), 数据集/原始JSON/dim_会员主档.json (5848b), 数据集/原始JSON/dim_会员身份桥.json (5711b), 数据集/原始JSON/dim_券模板.json (4223b), 数据集/原始JSON/dim_加盟商主档.json (5002b), 数据集/原始JSON/dim_员工导购.json (4034b)","readmeExcerpt":"Skill: 会员运营 · 马甲实战版 Owner: maojiebc Summary: 会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。 Tags: agent-skill:1.4","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"清单/          三张总清单 CSV（数据集 / ETL / 看板，含 ID）——先看这里拿全景\n公式库/        餐饮 BI 公式实战库（README + 10 册）★ 算法和口径 SQL 都在这\n分享/          直播分享书面实录（34 页插画长文）★ 想先看故事的从这进\n数据集/\n  结构定义/    每个数据集的字段结构说明 ★ 最值得先看\n  数据样本/    每表最多 200 行模拟样本 CSV（小表按实际规模），表头即当前 schema\n  原始JSON/    观远平台 v1.4.0 历史快照（审计用）\nETL/\n  逻辑SQL/     25 条加工链的节点结构和 SQL 逻辑 ★ 口径都在这\n  公共口径/    v1.4.2 事实桥 / 时间规范 / 规则任务 + 业务验收 SQL ★ 多链共用的正确性底座\n  原始JSON/    v1.4.0 workshop 历史快照（不是 v1.4.1 可导入包）\n看板/\n  页面文档/    v1.4.1 校正后的卡片字段清单\n  页面JSON/    v1.4.0 页面布局历史快照（旧字段，不可直接导入）\nskillhub/      ⚙️ 自动生成产物（ClawHub / npm 发布包的瘦身文本子集）\n               勿手动修改——改根目录再跑 python3 tools/build_skillhub_bundle.py\ntools/         构建脚本（含 --check 漂移检测模式）"},{"language":"bash","snippet":"# ClawHub / OpenClaw\nclawhub install majia-huiyuan\nopenclaw skills install majia-huiyuan\n\n# GitHub CLI（gh 2.90+）\ngh skill install maojiebc/majia-huiyuan majia-huiyuan --agent claude-code --scope user\n\n# 手动 clone 到对应 agent 的 skills 目录\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.claude/skills/majia-huiyuan   # Claude Code\ngit clone https://github.com/maojiebc/majia-huiyuan.git ~/.codex/skills/majia-huiyuan    # Codex"},{"language":"sql","snippet":"SELECT * FROM input"},{"language":"sql","snippet":"SELECT * FROM input"},{"language":"sql","snippet":"WITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p"},{"language":"sql","snippet":"WITH params AS (SELECT DATE '2026-06-24' AS as_of_date),\norder_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `会员ID`) AS `当月活跃会员`,\n    COUNT(DISTINCT CASE WHEN `是否会员首单` = 1 THEN `会员ID` END) AS `新增首单会员`,\n    SUM(`实付金额`) AS `总销售`,\n    SUM(CASE WHEN (`会员ID` IS NOT NULL AND `会员ID` <> '') THEN `实付金额` ELSE 0 END) AS `会员销售`,\n    SUM(CASE WHEN `是否到店` = 1 THEN `实付金额` ELSE 0 END) AS `到店销售`,\n    COUNT(DISTINCT `订单ID`) AS `总订单数`\n  FROM input1 CROSS JOIN params p\n  WHERE `订单状态` = '已完成' AND `业务日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`业务日期` AS DATE))\n),\ntouch_monthly AS (\n  SELECT\n    DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE)) AS `年月`,\n    COUNT(DISTINCT `触达ID`) AS `触达次数`,\n    COUNT(DISTINCT `会员ID`) AS `触达会员数`\n  FROM input2 CROSS JOIN params p\n  WHERE `触达状态` = '已发送' AND `触达日期` <= p.as_of_date\n  GROUP BY DATE_TRUNC('MONTH', CAST(`触达日期` AS DATE))\n)\nSELECT\n  o.`年月`,\n  o.`当月活跃会员`, o.`新增首单会员`,\n  o.`总销售`, o.`会员销售`, o.`到店销售`, o.`总订单数`,\n  COALESCE(t.`触达次数`, 0) AS `触达次数`,\n  COALESCE(t.`触达会员数`, 0) AS `触达会员数`,\n  CASE WHEN o.`总销售` > 0 THEN o.`会员销售` / o.`总销售` ELSE 0 END AS `会员销售占比`,\n  CASE WHEN o.`总销售` > 0 THEN o.`到店销售` / o.`总销售` ELSE 0 END AS `到店销售额占比`,\n  p.as_of_date AS `数据快照日期`\nFROM order_monthly o\nLEFT JOIN touch_monthly t ON o.`年月` = t.`年月`\nCROSS JOIN params p"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: majia-huiyuan\ndescription: \"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。\"\nlicense: MIT\nmetadata:\n  version: \"1.4.5\"\n  author: \"超级马甲 / maojiebc\"\n  homepage: https://github.com/maojiebc/majia-huiyuan\n  openclaw:\n    emoji: \"🪪\"\n    homepage: https://github.com/maojiebc/majia-huiyuan\n---\n\n# 会员运营 · 马甲实战版\n\n你装上的是一套**开源会员运营家底**：一个可审计、可改造的连锁会员数据中台样板间 + 一座口径公式库 + 一份方法论实录。你的角色是**会员数据顾问**——用户大概率是业务或数据分析背景，不是工程师：先人话，后术语；每个结论给出处路径。SQL 是待验证参考实现，不能承诺“换表名即可生产”。\n\n## 功能架构\n\n一图看全：三大资产 → 五层数仓 → 会员数据顾问能干的十类活。\n\n![majia-huiyuan 功能架构](https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png)\n\n## 三大资产\n\n> SkillHub 为文本精简包：保留结构定义、ETL 逻辑、看板文档、公式库与方法论正文；数据样本、原始 JSON 和图片请从 GitHub 完整版读取。\n\n| 资产 | 位置 | 是什么 |\n|---|---|---|\n| **样板间** | `数据集/` `ETL/` `看板/` `清单/` | 咖啡连锁模拟中台：55 个逻辑数据集（DIM10/DWD16/DWS16/ADS8/DQC1/param4）、25 条 ETL、12 张角色看板。校正逻辑以 `ETL/逻辑SQL/` + `ETL/公共口径/` + `看板/页面文档/` 为准；原始 JSON 与页面 JSON 仅是 v1.4.0 workshop 历史快照 |\n| **公式库** | `公式库/` | 10 册约 3100 行，蒸馏自真实履职（已脱敏）：复购 / RFM（按最近来没来、来得勤不勤、花得多不多分层）/ 核销 / 留存流失的标准 SQL、通用字段词典、数据质量三态坑、DWD 宽表范式、39 生产 ETL 索引、任务与触达回收模型。总入口 `公式库/README.md`（路由表 + 5 条最易踩的坑） |\n| **方法论实录** | `分享/区域运营的一天/README.md` | 获奖直播书面实录（34 页插画）：区域运营痛点 → AI 跑五步人拍板 → 可信四件套 → 三案例（归因到人 / 会闭嘴 / 会多看一眼）→ 四类人落地 FAQ |\n\n## 任务路由（用户要 X → 你做 Y）\n\n常见问题可先读 [实战问题入口](公式库/实战问题入口.md)：复购对账、门店读数、注册归因、员工激励、券核销、开业回收、召回与储值事件。它说明最少要什么数据、什么结果才算答到了问题。\n\n| 用户要什么 | 你怎么干 |\n|---|---|\n| **问口径 / 公式**（\"复购怎么算\"\"RFM 怎么分层\"\"核销率口径\"） | 先查 `公式库/README.md` 路由表进对应分册拿标准 SQL；再对照 `ETL/逻辑SQL/` 里样板间的实际实现，两处一致时置信度最高。**必须提口径选项**（如复购跨天 vs 非跨天是两条曲线）。注意 RFM 有两套并存口径：公式库 02 册是高低二分 8 类（快速起步），样板间 ETL 是 5 分制 9 类（精细运营）——先问用户场景再选，不要混用 |\n| **业务动作要数据依据**（\"做一次流失召回\"\"新客怎么促二单\"\"外卖客怎么拉到店\"\"任务怎么派给导购\"） | 按\"圈谁 → 何时 → 力度 → 派给谁 → 怎么回收\"五件套作答：圈选条件出自 `dws_会员生命周期`（7 阶段状态机）/ `dws_会员RFM分层` / `dws_渠道迁移分析`（近 30 天 vs 前 60 天堂食外卖迁移）；时机与力度阈值出自 `公式库/02` 的 R 阈值分级决策表（14/21/30/60 天四档对应不同券力度）+ `param_` 参数表；分派与回收模型出自 `公式库/10-task-and-touch-recovery.md`（任务池 NBA 模型）。**执行内容（话术/素材/社群 SOP）切 majia-siyu，明确告知用户** |\n| **搭 CDP / 标签体系 / 身份打通** | OneID 样板 = `dim_会员身份桥`（手机号 Hash / OpenID / UnionID / 企微外部联系人 / 支付渠道五类身份 + 匹配置信度 + 匹配方式）；身份合并优先级 SQL 在 `公式库/02` 开篇\"顾客标识统一化\"；标签规则外置范式 = `param_` 参数表模式（阈值不硬编码进 SQL）；Profile+Events 双层 = `dim_会员主档` + 六张 `dwd_` 事件表 |\n| **从零设计会员数据体系** | 以 `清单/数据集清单.csv` 为蓝本，按 DIM→DWD→DWS→ADS 分阶段给**最小可用集**：先档案（会员主档/门店主档）+ 订单流水，再算汇总（RFM/生命周期），再上报表。绝不一次吐 55 张表 |\n| **诊断现有体系缺什么** | 把 55 个逻辑数据集当 checklist，逐层对照用户已有的表，输出缺口清单 + 补齐优先级（优先补影响口径的 DIM 和 param） |\n| **生成建表语句** | 用 `数据集/结构定义/*.md` 的字段与类型信息推 schema；需要取值样本时读取 GitHub 完整版的 `数据集/数据样本/*.csv`，翻译成用户的目标引擎方言（源是 Spark 3.4，MySQL/ClickHouse/PG 注意函数差异并主动提醒） |\n| **规划看板体系** | 参照 12 张角色看板（`看板/页面文档/`）：老板看驾驶舱、会员负责人看私域盘、店长看每日指挥台、加盟商看单店报告——按用户组织架构裁剪，每个角色一张 |\n| **数据质量排障**（\"两套数对不上\"\"AI 老搞混字"},{"path":"ETL/公共口径/README.md","content":"# v1.4.2 公共口径\n\n这里放 25 条示范 ETL 共用的三条事实桥，以及第二刀抽出的时间规范。为让单条逻辑文档可独立阅读，当前核心 ETL 仍内嵌了等价实现，并由自动测试约束窗口、有效性、唯一性和 SCD2 去重保持一致；生产落地时应先物化公共口径，再让下游直接引用。\n\n## 事实桥\n\n| 事实桥 | 输入 | 唯一性 | 用途 |\n|---|---|---|---|\n| `01_触达订单归因桥.sql` | 会员触达 + 已完成订单 | 每个订单最多命中一次最近有效触达 | 私域漏斗、高层驾驶舱、触达后关联销售 |\n| `02_券实例核销订单桥.sql` | 券实例事件 + 已完成订单 | 每个订单最多命中一个实际核销券实例 | 核销订单 GMV、优惠成本 |\n| `03_活动参与订单归因桥.sql` | 活动参与 + 已完成订单 | 每个订单最多命中一次最近有效活动参与 | 活动参与后归因 GMV |\n\n共同约束：\n\n1. 所有输入事实日期不得晚于同一个 `as_of_date`。\n2. 归因只能发生在事件之后；默认滚动窗口为事件时间（含）至事件时间加 8×24 小时（不含），标记为 0–7 天，可由调度参数替换。\n3. 使用 `ROW_NUMBER() OVER (PARTITION BY 订单ID ...) = 1` 强制订单级唯一性。**三种口径各自独立**：同一订单可以同时出现在触达桥、券桥和活动桥，但不能在同一条桥里出现两次。\n4. 下游一律按订单发生日期汇总，不能把未来七天订单塞回触达日或参与日。\n5. 这些桥只证明“时间窗口内关联”，不证明增量。没有随机对照或合格准实验时，只能叫“关联 GMV / 归因 GMV”，不能叫“贡献销售 / 增量 ROI”。\n6. 券实例只有在核销日期落在发放日至失效日内、且不晚于 `as_of_date` 时才是有效核销；异常多券同单时按优惠金额降序、券 ID 升序只保留一张券承接订单 GMV。\n7. `04_v1.4.1_业务验收.sql` 必须同时检查三条桥的订单唯一性和“归因 GMV ≤ 同期已完成订单 GMV”。只验收触达桥不算第一刀完成。\n\n## 时间规范\n\n| 规范 | 粒度 | 约束 |\n|---|---|---|\n| `05_门店营业日历.sql` | 一门店 × 一个自然营业日 | 开业日至 `min(闭店日, as_of)` 每天一行，当天 0 单也保留。开闭店边界只取当前版本。 |\n| `06_门店月份骨架.sql` | 一门店 × 一个营业月份 | 开业月至 `min(闭店月, as_of 月)` 每月一行，零销售但有成本的月份必须留下。月份属性按 `维度命中日期` 走 SCD2。 |\n| `07_SCD2门店时点关联.sql` | 一条事实 × 一个门店版本 | 每个 `(门店ID, 事实日期)` 最多一个版本；重叠窗口按生效起始日、版本 ID 降序只留一行，`scd_rn = 1`。关联前后事实行数守恒。 |\n\n时间规范额外约束：\n\n1. 开闭店边界可以用当前版本；**日/月属性禁止用当前版本回写历史**，必须按事实日期做 SCD2。\n2. 指挥台、门店日报、利润月汇总、新店爬坡、体验口碑都必须在关联后门店键不重复。\n3. 同期群未走完整观察期的 `Mn`（不含 M0）必须输出空的留存人数和留存率。\n4. `04_v1.4.1_业务验收.sql` 第 23–27 项检查门店日/门店月/新店爬坡/体验口碑唯一性，以及未完整观察月的空值。\n\n## 规则任务生成\n\n| 规范 | 粒度 | 约束 |\n|---|---|---|\n| `08_规则任务生成.sql` | 一个会员 × 一条规则任务 | 九类圈选先 UNION ALL；营销任务挡近 7 日触达，负评修复豁免；再按 P0<P1<P2、预计价值降序只留一条。 |\n\n任务生成额外约束：\n\n1. 这是候选任务，不是 `dwd_会员经营任务` 的执行快照。`ads_会员经营任务池` 仍展示已分派任务。\n2. `推荐原因` 必须在生成时写成带数字的人话；`预计价值` 冷启动用历史客单价，不是增量。\n3. 防打扰查 `dwd_会员触达`，不查任务表。负评修复不参加防打扰，但参加仲裁。\n4. 营销任务按会员 ID 数字尾号做 10% holdout（尾号 0）；负评修复不进对照。触达后下单不能叫增量。\n5. `04_v1.4.1_业务验收.sql` 第 28 项检查规则任务会员唯一。\n6. 漏斗、高层驾驶舱、券效益、活动复盘的归因 CTE 必须使用与本目录相同的桥名：`bridge_触达订单归因` / `bridge_券核销订单` / `bridge_活动参与订单归因`。生产应先物化这三张桥，再让下游直接引用。\n\nSQL 为 Spark 3.4 方言。文件中的 `DATE '2026-06-24'` 是本模拟快照的默认值，生产调度必须替换为同一批次的运行参数。"},{"path":"README.md","content":"# majia-huiyuan · 会员运营家底（开源样板间）\n\n[![Skill Version](https://img.shields.io/badge/skill-v1.4.5-blue)](./SKILL.md)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green)](./LICENSE)\n[![skills.sh](https://skills.sh/b/maojiebc/majia-huiyuan)](https://skills.sh/maojiebc/majia-huiyuan)\n[![Release](https://img.shields.io/github/v/release/maojiebc/majia-huiyuan?label=release&color=success)](https://github.com/maojiebc/majia-huiyuan/releases)\n[![Quality](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml/badge.svg)](https://github.com/maojiebc/majia-huiyuan/actions/workflows/quality.yml)\n[![AI Agent Friendly](https://img.shields.io/badge/AI_Agent-friendly-1abc9c)](./AGENTS.md)\n[![Data](https://img.shields.io/badge/%E6%95%B0%E6%8D%AE-%E5%85%A8%E6%A8%A1%E6%8B%9F%E7%94%9F%E6%88%90-orange)](#数据说明必读)\n\n> **会员运营 · 马甲实战版** — 一套**完整、可审计、可改造的**连锁会员数据参考体系。以一家虚构的咖啡连锁为例，从会员注册的第一行数据，到老板看的经营驾驶舱：**55 个逻辑数据集、25 条数据加工链、12 张看板，外加约 3100 行的实战公式库**，全部摊开。\n>\n> 数据全部模拟生成，与任何真实企业无关。MIT 协议，个人用、公司用、商用，都随便。\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/maojiebc/majia-huiyuan/main/docs/architecture.png\" width=\"440\" alt=\"majia-huiyuan v1.4.1 功能架构：三大资产 + 五层数仓 + 会员数据顾问十类活 + 与 majia-siyu（执行内容）及 majia-guanyuan（平台工具）的分工\"/>\n</p>\n\n**谁适合看**：做会员、做私域的业务同学；做数据分析、数据建设的同学；想给自己公司从零搭一套会员数据体系的人。**不需要会写代码。**\n\n**AI 也适合看**：如果你是 AI Agent（WorkBuddy / Claude / Codex / Cursor …），你的入口在 [llms.txt](./llms.txt) 和 [AGENTS.md](./AGENTS.md)；本仓库同时是一个可安装的 **Agent Skill**（[SKILL.md](./SKILL.md)），装法见[下方](#-当-agent-skill-用)。\n\n---\n\n**你是谁，直接去哪里：**\n\n| 我想做的事 | 直接去 |\n|---|---|\n| 店长先看什么、新增怎么算、奖励怎么结 | [实战问题入口](公式库/实战问题入口.md) |\n| 找某个指标怎么算（复购率、RFM、核销率…） | [公式库/README.md](./公式库/README.md) → 按主题找分册 |\n| 看表结构 / 字段定义 / 数据长什么样 | [数据集/结构定义/](./数据集/结构定义/) + [数据集/数据样本/](./数据集/数据样本/) |\n| 理解某条 ETL 的加工逻辑和 SQL 口径 | [ETL/逻辑SQL/](./ETL/逻辑SQL/) 按表名找对应 md |\n| 搭观远 BI，理解原 workshop DAG / 布局 | [ETL/原始JSON/](./ETL/原始JSON/) + [数据集/原始JSON/](./数据集/原始JSON/) + [看板/页面JSON/](./看板/页面JSON/)（均为历史快照，不含 v1.4.1 字段修复；资源 ID 也不可移植） |\n| 用 AI 工具直接问会员数据问题 | [SKILL.md](./SKILL.md) 装成 Agent Skill，或把仓库地址扔给 AI |\n| 发布到 WorkBuddy 开放平台 | [workbuddy/README.md](./workbuddy/README.md) → 生成自包含单专家 ZIP，并先跑平台契约测试 |\n| 先看故事再翻表 | [分享/区域运营的一天/](./分享/区域运营的一天/README.md) |\n\n> **v1.4.5 可信边界：**`ETL/逻辑SQL/`、[`ETL/公共口径/`](./ETL/公共口径/) 与 `看板/页面文档/` 是当前校正后的参考口径；本次补充门店经营口径与实战问题入口，数仓参考逻辑沿用 v1.4.2，仍需用自家数据验证后再生产化。`*/原始JSON/` 和 `看板/页面JSON/` 是 2026-06-24 的 workshop 历史快照，保留用于审计原 DAG / 布局，**未同步改造成可直接导入包**，其中仍可能出现旧字段名。当前 SQL 定位是“待验证示例”，不是标准答案。未做 Spark 全量回放。\n\n---\n\n## 这是什么\n\n会员运营这行有块三不管地带：字段怎么定义、口径怎么算、看板怎么搭，做业务的嫌它是技术细节，做数据的嫌它是业务琐事，两边都懂的人当它是吃饭本事。结果就是，想学的人找不到一份能从头看到尾的完整参照。\n\n这个仓库就是那份参照——一个\"样板间\"。\n\n它是 2026 年 5 月在观远 BI 官方 workshop 实例上独立搭建的一套完整会员数据中台，虚构了一家咖啡连锁：**8 万会员、1200 家门店、141 个加盟商、74 个商品、129 万笔订单**。麻雀不大，五脏俱全：会员注册、订单、发券、积分、私域触达、投诉评价、加盟分账、门店成本，全链路的数据都有，而且是打通的。\n\n毛坯房教不会人装修，样板间可以。你不一定照单全收，但每面墙长什么样、水电怎么走，这里都看得见。\n\n本仓库会持续迭代，路线图见[下方](#路线图)。\n\n## 三分钟看懂：数据分五层\n\n所有数据集按五层组织（这是数据行业的通用做法，名字唬人，事情简单）：\n\n| 层 | 行话 | 人话 | 本库数量 |\n|---|---|---|---|\n| **DIM** | 维度层 | **档案柜**：会员档案、门店档案、商"},{"path":"公式库/README.md","content":"# 餐饮零售 BI 公式实战库\n\n> 蒸馏自两段连续的餐饮 BI 分析师履职（**餐饮连锁 A + 餐饮连锁 B**，均为多门店连锁餐饮品牌），覆盖**观远 BI / Guandata** 平台上的常用 ETL SQL、卡片表达式、时间宏；第 [10 册](10-task-and-touch-recovery.md)另以本仓库样板间的任务池实现为蓝本。所有品牌名、表名、密集业务字段已去敏，可自由复用。\n\n门店问题先读 [实战问题入口](实战问题入口.md)：注册归因、激励结算、核销排错、开业留客、日常读数与储值事件。口径仍由下面 10 册统一维护。\n\n## 路由表\n\n| 我要算 / 处理 | 去 |\n|---|---|\n| 日期范围（T-1、本月、上月、近 N 天）、用餐时段、时间宏、跨月对齐 | [01-date-and-time.md](01-date-and-time.md) |\n| 新老客 / 会员属性 / 消费频次 / 复购 / 留存 / 流失 / **RFM 8 类 × 营销策略** / R 阈值多档分级 | [02-customer-and-membership.md](02-customer-and-membership.md) |\n| AC / ADS / ADT / AUD / Comp / TC_CRM% / NS_CRM% / 营收占比 | [03-revenue-kpi.md](03-revenue-kpi.md) |\n| 堂食 vs 外卖渠道分流 / 订单子渠道大 case / 门店生命周期 / StoreDate / 成长类型 / **多渠道评价 Pipeline** | [04-channel-and-store.md](04-channel-and-store.md) |\n| 核销率 / 折扣率 / 折扣分桶 / 首张券 / 30 天优惠订单比例 | [05-coupon-and-discount.md](05-coupon-and-discount.md) |\n| `regexp_extract` / `explode-split` / `collect_set-concat_ws` / 开窗排名 / 字段拆解 | [06-sql-utils.md](06-sql-utils.md) |\n| NULL / 空字符串 / 'null' 字面值三态 / 字段口径歧义 / 通用字段词典 | [07-data-quality-traps.md](07-data-quality-traps.md) |\n| **ETL 工程范式**（10-CTE DWD 宽表 / 轻节点重 SQL vs 重节点轻 SQL / 财务双源对账 / POS 归一化 / Cohort 网格）| [08-etl-engineering-patterns.md](08-etl-engineering-patterns.md) |\n| **39 个 V1 生产 ETL 索引清单**（按 11 个业务域分类 + 每 ETL 的节点/输入/输出/SQL 节点速查 + 复用决策表）| [09-etl-catalog.md](09-etl-catalog.md) |\n| **任务与触达回收**（白盒 NBA 任务池模型 / 九类任务×优先级×圈选依据 / 任务生成 SQL / 防打扰与仲裁 / 漏斗四率回收 / **差评客户挽回**）| [10-task-and-touch-recovery.md](10-task-and-touch-recovery.md) |\n\n## 通用字段词典\n\nETL 输入表统一称作 `input1`（观远 SmartETL 默认入参名），其余字段命名约定如下。**本库所有 SQL 都使用这套约定，复用时按你方实际字段名重命名即可。**\n\n| 词典名 | 含义 | 等价别名（你可能遇到的） |\n|---|---|---|\n| `订单号` | 订单唯一 ID | `OrderKey` / `order_id` / `券包订单ID` |\n| `订单日期` | 业务日期 | `businessDate` / `report_date` |\n| `下单时间` | 含时分秒的下单时刻 | `OrderTime` / `create_time` |\n| `去税营业额` | 营收口径（剔税） | `去税营业额 NS` / `income_应收` / `NS` |\n| `含税营业额` | 营收口径（含税） | `含税营业额 GS` / `total` / `GS` |\n| `原价金额` | 折扣前金额 | `原价金额 ALA_Sales` / `ALA` / `original_price` |\n| `折扣金额` | 让利金额 | `Discount` |\n| `销量` | 商品件数 | `QTY` |\n| `订单产品` | 商品名字符串 | `Items` / `names` / `names_grill` |\n| `顾客标识` | 跨渠道统一顾客 ID（优先级：会员卡号 > 微信 openid > 支付宝 user_id > 云闪付 user_id） | — |\n| `会员卡号` | 会员 ID | `MemberShipID` / `dis_cardno` / `card_no` |\n| `是否会员` | 二值或三值标记 | `MemberType` / `IsMember` |\n| `门店编号` | 门店唯一 ID | `StoreID` / `store_code` |\n| `门店名称` | 门店中文名 | `store_name` / `SHOP_NAME` |\n| `分公司` | 区域分公司 | `注册所属分公司` / `归属分公司` |\n| `渠道ID` | 数字化渠道码（外卖、堂食、自取等） | `CHANNEL_ID` |\n| `来源类型` | 二级来源（微信/支付宝/拼单/POS 等） | `FromType` / `OrderSource` |\n| `业务渠道` | 一级归类（堂食/外卖） | `Channel` / `业务渠道划分` |\n| `StoreDate` | `CONCAT(门店编号, '_', 营业日期)`，作为门店×日的唯一键 | — |\n| `Comp` 标记 | 是否同店可比 | `IsComp` |\n| `TC` | 客流数 / 订单笔数 | — |\n\n## 5 条最容易踩的坑（TL;DR）\n\n1. **`COUNT(DISTINCT IF(cond, x, NULL))` 才正确，写 `IF(cond, x, 0)` 会把 0 也计数一个。** → 详见 [07](07-data-quality-traps.md#null-vs-0)\n2. **顾客标识三态**：`NULL` / 空字符串 `''` / 字面量 `'null'` 必须**三个都判**，否则统计会漂。 → [07](07-data-quality-traps.md#三态判断)\n3. **`COUNT(订单号)` 和 `COUNT(DISTINCT 订单号)` 不一样**：拼单订"},{"path":"分享/区域运营的一天/README.md","content":"# 区域运营的一天 · 直播分享全记录（34 页插画版）\n\n> 2026 年 7 月 9 日，观远数据「对话 AI Hero」第一期直播，我把 AI 创新赛一等奖作品《区域运营的一天》从头到尾讲了一遍，线上 70 多人，讲了一个多小时。这份文档是那场直播的书面整理版：34 页插画板全部嵌入，讲述文字从直播逐字稿蒸馏而来，去掉了口水话，保留了当时真实讲的内容和现场问答。\n>\n> 当时演示用的整套数据环境有 54 个数据集、25 条 ETL、12 张看板；v1.4.1 将误名参数表拆分后，当前仓库为 55 个逻辑数据集——看完这篇，回到 [仓库首页](../../README.md) 就能查看完整模拟中台。\n\n---\n\n## 一、开场：这是一场什么分享\n\n![](images/a1.jpg)\n\n作品叫《区域运营的一天》。一句话：区域运营过去要花一上午干的巡店分析，让 AI 压缩到几分钟——不是做一张更快的报表，是把\"发现问题、分析原因、推动行动\"这条每天必走的动作链整个交给 AI 跑，人只做最后的拍板。\n\n![](images/a2.jpg)\n\n先交代我是谁：我不是数据分析师出身，是业务，在门店堆里泡了十几年的用户运营，做过到家、做过实体零售，现在在连锁餐饮负责会员体系。我自己搭过 BI 看板、导过数据集，但算不上专业人士——正因为不专业，这套东西对我这种人能跑通，对你大概率也能。\n\n![](images/a3.jpg)\n\n路线四站：先讲区域运营的一天有多烦（痛点），再讲 AI 接手之后的一天长什么样（方案），然后回答 AI 凭什么可信（底座），最后当场真跑三个问题（演示）。\n\n![](images/a4.jpg)\n\n直播时我说这不是汇报，是聊天，有疑问随时打断。落到这份文档：读到哪觉得不对，[提个 issue](https://github.com/maojiebc/majia-huiyuan/issues) 就是打断我。\n\n## 二、痛点：一上午是怎么被吃掉的\n\n![](images/b1.jpg)\n\n给主角取了个花名，花十六，区域督导，管几十家店，一年大部分时间在辖区里跑。他每天早上的活：翻三个看板——利润的、口碑的、会员的——找出哪家店红了；发现一家在亏，打电话问店长，店长说\"隔壁店也这样\"；只好拉 Excel 人肉对口径，你说的口径是 A，他理解的是 B。一上午过去，只够看几家店。我们这行还有个背景：BI 权限往往下放不到一线督导，大家实际流转的还是企业微信里的本地 Excel。\n\n![](images/b2.jpg)\n\n我们之前也试过各种智能体、机器人，它们很勤奋，不断弹通知：这个指标跌了、那个数据负增长。但大部分是无效信息。预警一多，等于没有预警。\n\n![](images/b3.jpg)\n\n更要命的是误报比漏报贵。报警信息一旦出错，一线的人第一反应不是\"数据有问题\"，是\"AI 很蠢\"——信任这个东西，错一次，你再想让他给第二次机会，很难。\n\n![](images/b4.jpg)\n\n演示环境 1200 家店里，P0 级严重亏损 103 条，集中在约 30 家门店，连着几个月失血。真正贵的不是亏损本身，是归因延迟：从\"被报警\"到\"搞清为什么、谁去管\"，中间隔着的每一天都是钱。\n\n## 三、方案：AI 跑五步，人拍最后一板\n\n![](images/c1.jpg)\n\n现在花十六只问一句大白话：\"今天哪些店要我管？为什么？谁去管？\"不用把需求翻译成技术语言。顺带说个口径的老梗：顾客一天内下两单算不算复购？隔天下第二单才算？这种口径争议在我们早期吵了很久——大白话提问的前提，是口径已经有人钉死在表里（这正是本仓库[公式库](../../公式库/)管的事）。\n\n![](images/c2.jpg)\n\nAI 替他跑五步：**发现**（运营、利润、口碑、会员四路监控合成一张待办清单）、**归因**（异常出在房租、人工、客群还是口碑，沿数仓下钻排除）、**豁免**（寒暑假的学校店、爬坡期的新店，这些\"不该报的\"自动挡掉）、**派单**（每条异常带责任人、风险等级、建议动作）、**通知**（按区域经理分组生成日报）。\n\n![](images/c3.jpg)\n\n自动化的边界停在\"发送\"之前。日报生成好、推送模板备好，最后由人确认再发出。我试下来，不管多强的模型，最后的判断替代不了人——这也是每个经验丰富的业务、分析师真正的竞争力所在。\n\n## 四、底座：AI 凭什么可信\n\n![](images/d1.jpg)\n\n讲到这里通常会被问：这些判断，AI 凭什么？答案是它不凭感觉，它读的是一套业务看得懂、改得动、可对账的数据资产。\n\n![](images/d2.jpg)\n\n四件套。**参数表**：9 种店型乘 7 个参数的差异化阈值——商场店房租上限 28%、社区店 12%，判断标准从人脑和代码里搬进一张表；**归因清单**：四路异常合流成唯一出口，6115 行，每行带归因、责任人、建议动作，不再是两个地方查出两套结论；**对账自检**：九项检查每次重跑自动重跑，机器查机器；**护栏**：全量 103 条 P0 无一被豁免，\"闭嘴\"绝不闭出漏报。护栏这个思路是通用的——直播前一天我批量生成这些插画，就给流程加了一条\"检查图里中文有没有乱码，有就重生成\"，做数、做图、做文案，都得有收尾那道检查。\n\n![](images/d3.jpg)\n\n给数据打标签、建多维数据集，是老概念，AI 时代反而绕不开：字段有没有注释、有没有歧义，直接决定 AI 读出来的是判断还是猜测。\n\n![](images/d4.jpg)\n\n这套 demo 我是从零建的，但落回真实企业不需要推倒重来——现有 BI 资产全保留，只做增量。不过我想多说一句\"推倒重来的勇气\"：历史数据乱、字段没注释、前辈写的逻辑不敢碰，是每家的常态，我以前改一处报错就吓得回滚。现在 AI 能读全库，我第一次有了底气把 30 多条 ETL 理成十几条、把上千张没人打开的看板砍到几百张——推不推倒是选择，敢不敢推倒是能力。\n\n## 五、工具层：眼睛和手\n\n![](images/e1.jpg)\n\n我一开始以为 CLI 是给人看的说明书，后来才明白：它是给 AI 用的命令行，相当于 AI 的鼠标和界面。大模型是现成的大脑，缺的从来是眼睛和手——CLI 让 AI 看得懂你的数据资产（哪张是参数表、字段什么含义），也够得着（能查、能建、能跑）。\n\n![](images/e2.jpg)\n\n整个演示项目就是这么长出来的：我只提了一个朴素需求——\"帮我模拟一家 1200 家店的咖啡连锁，把该有的底表都建了\"。AI 生成了几十张表：会员、订单、积分、私域、加盟分账、门店成本，字段是真的（从我十几年业务经历里蒸馏的），数据是假的（全部模拟）。这套东西现在就躺在本仓库里。\n\n![](images/e3.jpg)\n\nETL 也进化了：从在画布上拖节点，到一段 SQL 直接跑。说实话，AI 写的不少 SQL 已经超出我的阅读能力，我找专业伙伴看过，他说能看懂大半——我不跟 AI 抢功劳，我出的是业务需求，它出的是工程。\n\n![](images/e4.jpg)\n\n以前\"把数据结构推倒重梳理\"是个大"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。 Skill: 会员运营 · 马甲实战版 Owner: maojiebc Summary: 会员数据顾问·马甲实战版（majia-huiyuan）。当核心交付物是会员指标口径、RFM、复购/留存/流失公式、核销率、客单价、会员分层/分群、人群圈选、标签体系、CDP、OneID 身份打通、Cohort、CRM/私域数据分析、会员数仓（DIM/DWD/DWS/ADS）、SQL/DDL、字段词典、数据质量、会员看板或观远 BI 复刻时使用。用户提出召回、提频、防流失、流失预警、新客转化、渠道迁移（外卖↔堂食）、导购任务分派等会员运营动作时，动作背后的数据依据（圈谁/何时/力度/派给谁/怎么回收）由本 Skill 负责；动作的执行内容（朋友圈、群发、欢迎语、社群 SOP、企微操作）与私域整盘经营诊断走 majia-siyu——同一动作的两半，先数据后执行。全部数值为模拟数据，仅结构与口径可引用。 Tags: agent-skill:1.4","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":940,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T11:48:59.337Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T14:17:56.223Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}