PostgreSQL视图对视图对视图..这是正确的方式吗



我有一个时间刻度数据库,用于接收来自两个系列能量传感器的数据。一个的更新频率为5’;,具有不同的时间偏移。计数器是累积的,我对5’时间样本的聚合数据很满意。我提供的解决方案使用了5个视图:一个用于每个传感器家族,以获得自然样本的差异,一个用于时间桶,最后一个用于外部连接两个家族:

CREATE VIEW sampled_net_energy AS
SELECT
time AS "time",
energy_t1_in + energy_t2_in - lag(energy_t1_in) OVER(ORDER BY time) - lag(energy_t2_in) OVER(ORDER BY time) as net_in,
energy_t1_out + energy_t2_out - lag(energy_t1_out) OVER(ORDER BY time) - lag(energy_t2_out) OVER(ORDER BY time) as net_out
FROM electricity
ORDER BY 1;
CREATE VIEW bucketized_net_energy AS
SELECT
time_bucket('5 minutes', time) AS five_min,
sum(net_in) as bkt_net_in,
sum(net_out) as bkt_net_out
FROM sampled_net_energy
GROUP BY five_min
ORDER BY 1;
CREATE VIEW sampled_solar_energy AS
SELECT
time AS "time",
pvenergytotal-lag(pvenergytotal) OVER(ORDER BY time) as solar_in
FROM t040504
ORDER BY 1;
CREATE VIEW bucketized_solar_energy AS
SELECT
time_bucket('5 minutes', time) AS five_min,
sum(solar_in) as bkt_solar_in
FROM sampled_solar_energy
GROUP BY five_min
ORDER BY 1;
CREATE VIEW energy_balance AS
SELECT
a.five_min, bkt_net_in, bkt_net_out, bkt_solar_in
FROM bucketized_net_energy a
INNER JOIN bucketized_solar_energy b
ON a.five_min = b.five_min
ORDER BY 1;

我试图将每个族的两个视图总结为一个视图,但似乎我不能在聚合函数(sum(中使用滞后级数,而且我的postgresql知识也没有比这更深入。如果房间里有postgresql专家,我的问题是:这是解决这个问题的正确方法吗?

更新:由";我不能在聚合函数中使用滞后序列";我的意思是,当我"选择sum(a-lag(a((为b"时,我会返回以下错误:"错误:聚合函数调用不能包含窗口函数调用"。

问题的解决方案是子查询。如果你不能做

SELECT sum(a - lag() OVER (...))
FROM ...
GROUP BY ...

改为:

SELECT sum(b)
FROM (SELECT a - lag(a) OVER (...) AS b
FROM ...) AS subq
GROUP BY ...

但我想提醒你们不要对观点下定义。这没有技术问题,但它会使维护和调试查询变得非常困难。这是因为在实际的查询中,所有视图都得到了解析,最终会得到一个很难理解的相当复杂的查询。特别是,您会面临连接额外不必要的表的风险,或者因为同一个表出现在两个视图中而与该表连接两次的风险。我多次被要求调整这样的查询,因为性能很差,而且很多时候我不得不放弃,因为巴比伦的观景塔对我简单的大脑来说太多了。

最新更新