如何在MariaDB中为每日查询结果计算行间差值(Delta)
解决方案
你可以将现有获取每日第一条数据的查询作为子查询,在外层使用LAG()函数获取上一行的verbrauch_ges值,进而计算行间差值。
完整SQL语句
SELECT created_at, verbrauch_ges, verbrauch_ges - LAG(verbrauch_ges) OVER (ORDER BY created_at DESC) AS taglicher_verbrauch FROM ( -- 原有查询:获取每日第一条数据 SELECT created_at, verbrauch_ges FROM pv_metrics GROUP BY DATE(created_at) ORDER BY ID DESC ) AS daily_first ORDER BY created_at DESC LIMIT 20;
关键说明
- 子查询逻辑:保留你原有的筛选逻辑,获取每日的第一条数据。需要注意:在严格SQL模式下,
GROUP BY DATE(created_at)搭配未聚合的created_at和verbrauch_ges可能返回不确定结果,更严谨的写法是用窗口函数明确获取每日最早写入的记录:
SELECT created_at, verbrauch_ges FROM ( SELECT created_at, verbrauch_ges, ROW_NUMBER() OVER (PARTITION BY DATE(created_at) ORDER BY created_at ASC) AS row_num FROM pv_metrics ) AS ranked WHERE row_num = 1 ORDER BY created_at DESC LIMIT 20;
将这段替换到外层查询的子查询中,能确保拿到的是每日最早的那条数据。
LAG函数的作用:
LAG(verbrauch_ges) OVER (ORDER BY created_at DESC)会按照日期倒序,获取当前行的上一行能耗值。用当前行数值减去上一行数值,得到的就是当日的能耗差值(taglicher_verbrauch)。结果说明:最终结果会包含日期、当日初始能耗值,以及当日与前一日的能耗差值(第一行因无前置数据,差值会显示为
NULL)。
内容的提问来源于stack exchange,提问作者DB5FP
相关产品推荐
相关产品推荐

