假期同步機制使用指南
概述
本機制解決了 holidays 表與 dim_date.is_holiday 之間的資料一致性問題,建立了完全自動化的同步機制和豐富的管理工具。
解決的問題
- 自動同步:
holidays表的任何變更自動反映到dim_date.is_holiday - 資料一致性: 確保兩個表之間的假期資料完全同步
- 歷史資料處理: 提供批次同步工具處理現有資料
- 完整性檢查: 自動檢測和修復資料不一致問題
- 影響分析: 量化假期對業務指標的影響
核心功能
1. 自動觸發器同步
每當 holidays 表發生變更時,系統會自動:
- 新增假期: 在
dim_date中標記對應日期為假期 - 更新假期: 保持假期標記的一致性
- 刪除假期: 移除
dim_date中的假期標記
sql
-- 範例:新增假期會自動同步
INSERT INTO holidays (date, name) VALUES ('2025-12-25', '聖誕節');
-- ↓ 自動觸發
-- UPDATE dim_date SET is_holiday = TRUE WHERE date = '2025-12-25';2. 批次同步功能
用於處理歷史資料或修復不一致問題:
sql
-- 同步所有現有假期
SELECT * FROM sync_all_existing_holidays();
-- 輸出範例:
-- operation_type | date_processed | status | message
-- SYNC | 2025-01-01 | SUCCESS | 已新增 2025-01-01 到 dim_date,假期狀態:TRUE
-- CLEANUP | 2025-02-15 | SUCCESS | 已移除錯誤的假期標記: 2025-02-15
-- SUMMARY | (null) | INFO | 同步完成: 12 筆成功, 0 筆錯誤3. 資料完整性檢查
檢測各種資料不一致問題:
sql
-- 檢查資料完整性
SELECT * FROM check_holiday_data_integrity();
-- 輸出範例:
-- check_type | issue_count | description | sample_dates
-- MISSING_HOLIDAY_FLAG | 3 | holidays 表中的假期在 dim_date 中未標記 | {2025-01-01,2025-05-01}
-- ORPHANED_HOLIDAY_FLAG | 1 | dim_date 中標記為假期但不在 holidays 表中 | {2025-02-30}
-- DUPLICATE_HOLIDAYS | 0 | holidays 表中有重複的日期 | {}4. 假期管理函數
提供便利的假期管理工具:
sql
-- 新增假期(自動同步到 dim_date)
SELECT add_holiday('2025-12-25', '聖誕節');
-- 回傳:已新增假期 2025-12-25: 聖誕節
-- 移除假期(自動從 dim_date 移除標記)
SELECT remove_holiday('2025-12-25');
-- 回傳:已移除假期 2025-12-25: 聖誕節
-- 更新假期名稱
SELECT add_holiday('2025-12-25', '聖誕佳節'); -- 會更新現有假期名稱
-- 回傳:已更新假期 2025-12-25: 聖誕佳節假期影響分析
holiday_impact_summary 視圖
提供假期對業務指標影響的深度分析:
sql
-- 查看假期影響分析
SELECT * FROM holiday_impact_summary ORDER BY holiday_date DESC LIMIT 5;輸出欄位說明:
holiday_orders: 假期當日訂單數holiday_revenue: 假期當日營收holiday_customers: 假期當日客戶數orders_multiplier: 訂單數相對於平日的倍數revenue_multiplier: 營收相對於平日的倍數customers_multiplier: 客戶數相對於平日的倍數holiday_type: 假期類型(週末假期/平日假期)
分析範例
sql
-- 分析哪些假期帶來最高的業績提升
SELECT
holiday_name,
holiday_date,
revenue_multiplier,
orders_multiplier,
holiday_type
FROM holiday_impact_summary
WHERE revenue_multiplier > 1.5 -- 營收超過平日1.5倍
ORDER BY revenue_multiplier DESC;
-- 比較週末假期 vs 平日假期的影響
SELECT
holiday_type,
COUNT(*) as holiday_count,
AVG(revenue_multiplier) as avg_revenue_impact,
AVG(orders_multiplier) as avg_orders_impact
FROM holiday_impact_summary
GROUP BY holiday_type;使用場景
1. 日常假期管理
sql
-- 新增國定假日
SELECT add_holiday('2025-10-10', '國慶日');
SELECT add_holiday('2025-02-10', '農曆新年');
-- 新增公司特殊假日
SELECT add_holiday('2025-06-15', '公司創立日');
-- 移除不再適用的假期
SELECT remove_holiday('2025-06-15');2. 資料維護
sql
-- 定期檢查資料完整性(建議每月執行)
SELECT * FROM check_holiday_data_integrity();
-- 發現問題時重新同步
SELECT * FROM sync_all_existing_holidays();3. 業務分析
sql
-- 分析最近一年的假期影響
SELECT
holiday_name,
holiday_date,
holiday_revenue,
revenue_multiplier,
CASE
WHEN revenue_multiplier >= 2.0 THEN '高影響'
WHEN revenue_multiplier >= 1.5 THEN '中影響'
WHEN revenue_multiplier >= 1.0 THEN '低影響'
ELSE '負影響'
END as impact_level
FROM holiday_impact_summary
WHERE holiday_date >= CURRENT_DATE - INTERVAL '1 year'
ORDER BY revenue_multiplier DESC;
-- 分析假期期間的活動效果
SELECT
h.holiday_name,
h.holiday_date,
c.campaign_name,
h.revenue_multiplier as holiday_impact
FROM holiday_impact_summary h
JOIN dim_date d ON h.holiday_date = d.date
LEFT JOIN campaigns c ON (
h.holiday_date BETWEEN c.start_date AND c.end_date
)
WHERE c.campaign_name IS NOT NULL
ORDER BY h.revenue_multiplier DESC;⚙️ 技術細節
觸發器邏輯
- INSERT/UPDATE: 自動標記
dim_date.is_holiday = TRUE - DELETE: 自動標記
dim_date.is_holiday = FALSE - 自動建立: 如果
dim_date中不存在該日期,會自動建立記錄
資料完整性保證
- 雙向檢查: 檢查 holidays→dim_date 和 dim_date→holidays 的一致性
- 重複檢測: 檢查 holidays 表中是否有重複日期
- 自動修復: 提供自動修復不一致資料的工具
效能考量
- 索引優化: 基於現有的
dim_date(date)主鍵索引 - 批次處理: 大量資料同步採用批次處理避免鎖定
- 日誌記錄: 適度的日誌記錄,避免影響效能
🔍 故障排除
常見問題
Q: 新增假期後 dim_date 沒有更新? A: 檢查觸發器是否正常運作:
sql
-- 檢查觸發器狀態
SELECT * FROM information_schema.triggers
WHERE trigger_name = 'trigger_holiday_sync';
-- 手動同步
SELECT sync_holiday_to_dim_date('2025-12-25', TRUE);Q: 資料不一致如何修復? A: 使用完整性檢查和批次同步:
sql
-- 1. 檢查問題
SELECT * FROM check_holiday_data_integrity();
-- 2. 批次修復
SELECT * FROM sync_all_existing_holidays();Q: 如何批量新增假期? A: 使用標準 INSERT 語句,觸發器會自動處理:
sql
INSERT INTO holidays (date, name) VALUES
('2025-12-25', '聖誕節'),
('2025-12-31', '跨年夜'),
('2026-01-01', '元旦');
-- 觸發器會自動同步所有假期到 dim_date📈 監控建議
定期檢查項目
- 每月執行完整性檢查
- 每季檢查假期影響分析的準確性
- 重大假期前確認資料同步狀態
異常監控
- 監控觸發器執行是否正常
- 檢查是否有大量資料不一致問題
- 關注假期影響分析的異常值
文件版本: 1.0
建立日期: 2025-07-23
下次更新: 預計與分層歸因策略一起更新