【发布时间】:2022-12-01 17:29:18
【问题描述】:
以下代码给出了灯已打开的总持续时间。
CREATE TABLE switch_times (
id SERIAL PRIMARY KEY,
is1 BOOLEAN,
id_dec INTEGER,
label TEXT,
ts TIMESTAMP WITH TIME ZONE default current_timestamp
);
CREATE VIEW makecount AS
SELECT *, row_number() OVER (PARTITION BY id_dec ORDER BY id) AS count
FROM switch_times;
select c1.label, SUM(c2.ts-c1.ts) AS sum
from
(makecount AS c1
inner join
makecount AS c2 ON c2.count = c1.count + 1)
where c2.is1=FALSE AND c1.id_dec = c2.id_dec AND c2.is1 != c1.is1
GROUP BY c1.label;
工作演示链接https://dbfiddle.uk/ZR8pLEBk
关于如何更改代码以便给出给定特定时间段内的总和的任何建议,比如 25 日,在此期间所有三个灯都打开了 12 小时?问题一:当前代码给出总和,如下。问题 2:所有未结束的持续时间都被忽略,因为没有关闭时间。
label sum
0x29 MH3 1 day 03:00:00
0x2B MH1 1 day 01:00:00
0x2C MH2 1 day 02:00:00
预期结果刚好超过给定日期,即
label sum
0x29 MH3 12:00:00
0x2B MH1 12:00:00
0x2C MH2 12:00:00
【问题讨论】:
-
你能提供你的预期输出吗?
-
请最小化您的示例,将其也放入问题中并添加预期结果。
-
按照建议修改。
-
请解释列的含义。明确任务。您是只想要三个给定标签的结果,还是想要出现在表格中的所有标签的结果,或者想要在给定时间段内有任何条目的标签的结果?
switch_times表中大约有多少行?有多少不同的标签?是否有每个(相关)标签一行的表格,如“标签”?你的 Postgres 版本?所有列(除了id)都可以是NULL?你需要风景?定义“25日”接近一点了。 (日期取决于其时区。)
标签: sql postgresql gaps-and-islands postgresql-performance