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 分钟。
在 PostgreSQL
中给出以下 tableCREATE 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 分钟。