如何通过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
相关产品推荐
相关产品推荐

