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

如何通过SQL查询计算本周与上周里程最大值的差值?

解决每周里程最大值差值统计的SQL实现

没问题,我帮你梳理下正确的实现思路和SQL代码!要得到每周最大里程与上周的差值,我们可以分两步来处理:先算出每个对象每周的最大里程,再通过窗口函数关联上周的数据计算差值。

步骤1:计算每周的最大里程值

首先我们需要基于年周和对象分组,获取每个对象每周的里程最大值。这里用到你提到的自定义函数Getyearweek()来生成年周标识:

WITH weekly_max_mileage AS (
    SELECT
        Getyearweek(Date) AS year_week,
        Object,
        MAX(Value) AS weekly_max_value
    FROM your_table_name  -- 替换成你的数据表名
    GROUP BY Getyearweek(Date), Object
)

这个CTE(公共表表达式)会生成一个临时结果集,包含每个对象在每一周的最大里程值,方便后续查询使用。

步骤2:计算本周与上周的差值

接下来我们用LAG()窗口函数,它能帮我们获取同一对象的上一周最大里程值,然后直接计算差值即可:

WITH weekly_max_mileage AS (
    SELECT
        Getyearweek(Date) AS year_week,
        Object,
        MAX(Value) AS weekly_max_value
    FROM your_table_name
    GROUP BY Getyearweek(Date), Object
)
SELECT
    year_week,
    Object,
    -- 本周最大值减去上周最大值得到差值
    weekly_max_value - LAG(weekly_max_value) OVER (
        PARTITION BY Object 
        ORDER BY year_week
    ) AS mileage_diff
FROM weekly_max_mileage
-- 过滤掉没有上周数据的记录(比如当年第一周)
WHERE LAG(weekly_max_value) OVER (
    PARTITION BY Object 
    ORDER BY year_week
) IS NOT NULL;

关键细节说明:

  • PARTITION BY Object:确保我们只在同一个对象的范围内对比周数据,不会把不同对象的里程混在一起计算。
  • ORDER BY year_week:因为你的Getyearweek()返回的是2020_01这种格式的字符串,按字符串排序和时间顺序是一致的,所以能正确拿到上一周的数据。
  • WHERE子句:用来过滤掉没有上周数据的记录(比如当年的第一周,此时LAG()会返回NULL,我们不需要这类无差值的结果)。

如果你只想查看特定对象的差值,可以在WHERE子句里加上AND Object = '目标对象名称'来过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 12:34:10