首页 > 解决方案 > 如何使用 PostgresSQL 计算满足组中条件的元素

问题描述

使用此查询:

SELECT date_trunc('minute', ts) ts, instrument
FROM test
GROUP BY date_trunc('minute', ts), instrument
ORDER BY ts

我按分钟对行进行分组,但我想生成一个布尔值,告诉我在组中是否至少有一行带有时间戳,其中秒数 < 10,并且至少有一行带有时间戳,秒数> 50。

简而言之,类似于:

lessThan10 = false
moreThan50 = false
for each row in the one minute group:
    if row.ts.seconds < 10 then lessThan10 = true
    if row.ts.seconds > 50 then moreThan50 = true

return lessThan10 && moreThan50

我想要实现的是找出我汇总的所有记录是否涵盖一分钟的开始和结束;如果这里和那里有漏洞也没关系,但是我们捕获的数据可能会在第 40 秒停止并重新启动,在这种情况下,我希望能够丢弃整分钟。由于数据速率变化很大,我无法检查最小行数。可能有更好的解决方案来实现这一点,所以我也对此持开放态度。

标签: postgresql

解决方案


用于EXTRACT()获取 和minmax秒数ts

SELECT date_trunc('minute', ts) ts, instrument,
       EXTRACT(SECOND FROM MIN(ts)) < 10 lessThan10, 
       EXTRACT(SECOND FROM MAX(ts)) > 50 moreThan50
FROM test
GROUP BY date_trunc('minute', ts), instrument
ORDER BY ts

请参阅演示


推荐阅读