以 15 分钟为间隔对“使用情况”进行 SQL 查询

问题描述 投票:0回答:3

我有一个数字仪表。该数字仪表将其计量数据放入(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,我将逻辑编码到应用程序中。

sql postgresql aggregate-functions date-arithmetic
3个回答
3
投票

如果您运行的是 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 关键字冲突。


1
投票
您可以将日期解析为 15 分钟的间隔,并使用它进行分组

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;

trunc_15_分钟dff2023-05-11 20:45:000.1502023-05-11 21:00:000.400
SELECT 2

小提琴


0
投票
XLODBC 1 DSN=xa21;UID=XAJTDB/N3ptunE1!!;DBQ=XA21;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST= T;BTD=F;BNF=F;BAM=If全部成功;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0;ODA=F;STE=F;TSZ=8192; AST=浮动;LPS=8192; 从 XAJTDB.TPCL_MW UNIT1_MW、XAJTDB.TPCL_MW UNIT2_MW 中选择 (UNIT1_MW.UTCTIME+5.5/24) 时间、UNIT1_MW.VALUE UNIT1_MW、UNIT2_MW.VALUE UNIT2_MW WHERE (UNIT1_MW.POINTNUMBER=19416 AND UNIT2_MW.POINTNUMBER=19454) AND ((UNIT1_MW.UTCTIME>={ts '2025-01-01 00:30:00'}) 和 UNIT1_MW.UTCTIME

={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 时间值

© www.soinside.com 2019 - 2024. All rights reserved.