You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用SQL查询计算2020年月度原始访问量相对2019年的变化率?

解决同一列中跨年月访问量变化率计算的SQL方案

没问题,我来帮你搞定这个需求!当两年的访问数据都在同一列时,我们可以通过自连接或者条件聚合的方式把同期数据对齐,再计算变化率。下面我分两种常用方法来演示,你可以根据自己的表结构调整。


先假设你的数据结构

首先咱们先明确下基础的表结构(你可以替换成自己实际的表名、字段名):
假设表名为visit_stats,包含三个核心字段:

  • year:年份(比如2019、2020)
  • month:月份(1-12)
  • raw_visits:当月原始访问量

方法一:自连接(直观易懂)

通过将表自身连接,把2019和2020年的同期数据关联到同一行,再直接套用公式计算:

SELECT
    t20.month,
    -- 计算变化率,ROUND保留2位小数,可按需调整
    ROUND((t20.raw_visits / t19.raw_visits) * 100, 2) AS visit_change_rate
FROM
    visit_stats t20
INNER JOIN
    visit_stats t19 ON t20.month = t19.month
WHERE
    t20.year = 2020
    AND t19.year = 2019
    -- 限定1-4月
    AND t20.month BETWEEN 1 AND 4
ORDER BY
    t20.month;

说明:

  • 给表起别名t20(代表2020年数据)和t19(代表2019年数据),通过month字段关联,确保同一月份的两年数据对齐。
  • INNER JOIN会自动过滤掉某一年缺失的月份(如果有的话),如果想保留所有1-4月(哪怕某一年没数据),可以换成LEFT JOIN,此时缺失数据的月份变化率会显示为NULL。

方法二:条件聚合(无需连接)

用CASE WHEN配合聚合函数,把两年的同期数据提取到同一行,再计算变化率:

SELECT
    month,
    ROUND(
        (MAX(CASE WHEN year = 2020 THEN raw_visits END) / MAX(CASE WHEN year = 2019 THEN raw_visits END)) * 100,
        2
    ) AS visit_change_rate
FROM
    visit_stats
WHERE
    year IN (2019, 2020)
    AND month BETWEEN 1 AND 4
GROUP BY
    month
ORDER BY
    month;

说明:

  • CASE WHEN会分别筛选出2020和2019年的访问量,MAX函数(因为每个月每年只有一条数据,用MIN/SUM也可以)将它们聚合到同一行。
  • 这种方法不需要表连接,代码更紧凑,适合数据量较大的场景。

额外优化:避免除以0报错

如果2019年某个月份的访问量为0,直接计算会触发除以0的错误,你可以用NULLIF函数处理:

-- 以自连接为例,条件聚合同理
ROUND((t20.raw_visits / NULLIF(t19.raw_visits, 0)) * 100, 2) AS visit_change_rate

这样当2019年数据为0时,变化率会显示为NULL,而不是报错。

以上两种方法最终都会返回4行数据,对应2020年1-4月各自相对2019年同期的访问量变化率。

内容的提问来源于stack exchange,提问作者sjs521

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:13:13