SQL 查询检测累计值何时达到限制

SQL query to detect when accumulated value reaches limit

在 PostgreSQL

中给出以下 table
CREATE TABLE my_table (
    time TIMESTAMP NOT NULL,
    minutes INTEGER NOT NULL);

我正在形成一个查询来检测 'minutes' 的累计值何时超过一个小时的边界。例如,table 中的以下数据:

time             | minutes
-------------------------
<some timestamp> | 55
<some timestamp> | 4

我想知道我们到达 60(一小时)之前还有多少分钟。在示例中,答案为 1,因为 55 + 4 + 1 = 60.

此外,我想在插入时知道这一点,所以如果我最后一次插入使累计分钟数超过“小时边界”,我希望它为 return boolean true。

我天真的尝试,没有插入部分,看起来像这样:

    SELECT
        make_timestamptz(
            date_part('year', (SELECT current_timestamp))::int,
            date_part('month', (SELECT current_timestamp))::int,
            date_part('day', (SELECT current_timestamp))::int,
            date_part('hour', (SELECT current_timestamp))::int,
            0,
            0
        ) AS current_hour,

        SUM(minutes) as sum_minutes
    FROM
        my_table
    WHERE
        sum_minutes >= 60

然后我将行数大于 0 表示我们越过了边界。但它非常不优雅,而且不起作用。这可能吗?是否有可能使其具有一定的性能?

我在 linux 上使用 Timescaledb/PostgreSQL。

嗯。 . . insert 并不是真正的 return 值。但是您可以使用 CTE 进行插入,然后在插入后对值求和:

with i as (
      insert into my_table ( . . . )
          values ( . . . )
          returning *
     )
select ( coalesce(i.minutes, 0) + coalesce(t.minutes, 0) ) > 60
from (select sum(minutes) as minutes from i) i cross join
     (select sum(minutes) as minutes from my_table) t

INSERT 可能如下所示:

WITH cur_sum AS (
   SELECT coalesce(sum(minutes), 0) AS minutes
   FROM my_table
   WHERE date_trunc('hour', current_timestamp) = date_trunc('hour', time)
)
INSERT INTO my_table (time, minutes)
SELECT current_timestamp, 12 FROM cur_sum
RETURNING cur_sum.minutes + 12 > 60;

此示例在当前时间插入 12 分钟。