常见日期报表(MTD、WoW、YoY)
使用 date_trunc 和自连接或窗口函数构建月初至今、周环比和年同比报表。
常见日期报表(MTD、WoW、YoY) 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
三种经典周期报表
几乎每个业务仪表板都需要:
- MTD — 月初至今
- 周环比 — 周与周之间的比较
- 同比 — 年与年之间的比较
月初至今
本月至今的总和:
SELECT SUM(total) AS mtd_revenue
FROM orders
WHERE created_at >= date_trunc('month', NOW())
AND created_at < date_trunc('month', NOW()) + INTERVAL '1 month';年初至今
相同模式,按年份计算:
SELECT SUM(total) AS ytd_revenue
FROM orders
WHERE created_at >= date_trunc('year', NOW());周环比
比较本周与上周:
SELECT
SUM(total) FILTER (
WHERE created_at >= date_trunc('week', NOW())
) AS this_week,
SUM(total) FILTER (
WHERE created_at >= date_trunc('week', NOW()) - INTERVAL '1 week'
AND created_at < date_trunc('week', NOW())
) AS last_week
FROM orders
WHERE created_at >= date_trunc('week', NOW()) - INTERVAL '1 week';同比
比较本周期与去年同期:
SELECT date_trunc('month', created_at) AS month, SUM(total)
FROM orders
WHERE created_at >= NOW() - INTERVAL '2 years'
GROUP BY 1
ORDER BY 1;
-- Then plot with two lines: current year, previous year.没有缺口的每日序列
如果某天没有订单,GROUP BY 会跳过这一天。生成完整的日历序列,然后使用 LEFT JOIN:
SELECT day, COALESCE(SUM(o.total), 0) AS revenue
FROM generate_series(
CURRENT_DATE - INTERVAL '30 days',
CURRENT_DATE,
INTERVAL '1 day'
) AS day
LEFT JOIN orders o ON date_trunc('day', o.created_at) = day
GROUP BY day
ORDER BY day;累计总和
窗口函数可以在不使用自连接的情况下计算累计总和:
SELECT day,
revenue,
SUM(revenue) OVER (ORDER BY day) AS running_total
FROM daily_revenue
ORDER BY day;周期环比差值
使用 LAG 计算同比增长:
SELECT month,
revenue,
LAG(revenue, 12) OVER (ORDER BY month) AS prev_year,
(revenue - LAG(revenue, 12) OVER (ORDER BY month))
/ NULLIF(LAG(revenue, 12) OVER (ORDER BY month), 0) AS yoy_growth
FROM monthly_revenue;最近 7/30 天(滚动窗口)
滚动窗口与按日历对齐的窗口有所不同。请选择真正符合业务含义的方式:
-- Trailing 7 days, ending now:
WHERE created_at >= NOW() - INTERVAL '7 days';
-- This calendar week, from Monday:
WHERE created_at >= date_trunc('week', NOW());时区注意事项
“今天”取决于用户所在的时区。请在截取日期前进行转换:
SELECT date_trunc('day', created_at AT TIME ZONE 'America/Los_Angeles') AS la_day,
COUNT(*)
FROM events
GROUP BY 1;使用物化视图预先聚合
如果每次加载页面都会运行某个报表,可以每天将它物化一次。相关内容请参阅“物化视图”。
回顾
周期报表依赖几种常见模式。
- 结合 date_trunc 使用半开区间
- 使用 FILTER 并行计算多个周期分桶
- 使用 generate_series + LEFT JOIN 补齐缺失日期
- 使用 LAG 计算周期环比差值
快速检查
哪个表达式表示“本月的第一个时刻”?
用 AI 导师学习 SQL — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 46
- 课程
- 183
常见问题解答
「常见日期报表(MTD、WoW、YoY)」课时是免费的吗?
是的 — 「常见日期报表(MTD、WoW、YoY)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「常见日期报表(MTD、WoW、YoY)」这节课中我会学到什么?
使用 date_trunc 和自连接或窗口函数构建月初至今、周环比和年同比报表。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「常见日期报表(MTD、WoW、YoY)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 日期运算与 INTERVAL
- EXTRACT、DATE_TRUNC、AGE
- 时区:TIMESTAMP 与 TIMESTAMPTZ
- 常见日期报表(MTD、WoW、YoY)