我有一个数字仪表。该数字仪表将其计量数据放入(Postgres)数据库中。相关数据如下:
时间戳,total_m3
每隔几秒到几分钟,我就会将数据记录到数据库中。因此,每隔 15 分钟,我的数据库中就会有 0 到 100 个条目。
total_m3 值是增量计量值。
我正在寻找一个选择查询来获取: 每 15 分钟仪表测量一次多少。
例如:
2023-05-11 20:59:49.000000, 296.650
2023-05-11 20:50:49.000000, 296.650
2023-05-11 20:45:49.000000, 296.250
2023-05-11 20:37:49.000000, 296.150
2023-05-11 20:30:49.000000, 296.000
结果应如下所示:
2023-05-11 21:00:00.000000, 0.4
2023-05-11 20:45:00.000000, 0.25
可以在 SQL 中做到这一点吗?或者我应该说 F* it,我将逻辑编码到应用程序中。
如果您运行的是 Postgres 14 或更高版本,您可以使用 date 函数
date_bin()
执行 15 分钟截断。
你想如何计算米差并不明显。
如果您正在寻找区间内的总体增长,最小值和最大值之间的差异应该会给您想要的结果:
select date_bin('15 minutes', ts, timestamp '2000-01-01') ts_15_min,
max(total_m3) - min(total_m3) meter_increase
from mytable
group by 1
order by 1
或者您可能想将前一个间隔的最后一个值与当前间隔的最后一个值进行比较。如果是这样,我们可以使用窗口函数:
select date_bin('15 minutes', ts, timestamp '2000-01-01') ts_15_min,
max(total_m3)
- lag(max(total_m3), 1, min(total_m3)) over(order by date_bin('15 minutes', ts, timestamp '2000-01-01')) meter_increase
from mytable
group by 1
order by 1
两个查询都假设仪表值始终在增加,如问题中所述。请注意,我将时间戳列重命名为
ts
,因此它不会与相应的 SQL 关键字冲突。
SELECT
date_trunc('minute', "dt") + interval '15 minute'
- (CAST(EXTRACT(MINUTE FROM "dt") AS integer) % 15) * interval '1 minute' AS trunc_15_minute
,MAX("value") - MIN("value") dff
FROM tabl1
GROUP BY trunc_15_minute
ORDER BY trunc_15_minute;
SELECT 2
={ts '2025-01-01 00:30:00' }) 和 UNIT2_MW.UTCTIME<={ts '2025-01-02 00:30:00'}) And ((UNIT2_MW.UTCTIME> <={ts '2025-01-02 00:30:00'})ORDER BY UNIT1_MW.UTCTIME
点号 UTC 时间值