SQL Academy · 课时

常见日期报表(MTD、WoW、YoY)

使用 date_trunc 和自连接或窗口函数构建月初至今、周环比和年同比报表。

第 4 / 4 课13 个步骤

常见日期报表(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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 日期运算与 INTERVAL
  2. EXTRACT、DATE_TRUNC、AGE
  3. 时区:TIMESTAMP 与 TIMESTAMPTZ
  4. 常见日期报表(MTD、WoW、YoY)
← 返回 SQL Academy