此问题从this question继续,我在其中还有另一列,称为“类型”。每种类型都有自己的dt和总值
例如:
dt total type
---------------------------------------
2019-07-01 10:00:00 150 A
2019-07-01 10:15:00 153 A
2019-07-01 10:30:00 155 A
2019-07-01 10:00:00 30 B
2019-07-01 10:15:00 35 B
2019-07-01 10:30:00 37 B
....
您会看到dt列中的日期时间在15分钟范围内。 每种类型的总数都随着时间增加(没有减少)
dt total type
---------------------------------------
2019-07-01 12:00:00 190 A
2019-07-01 12:15:00 193 A
2019-07-01 13:30:00 202 A
...
2019-07-01 11:00:00 41 B
2019-07-01 11:15:00 46 B
2019-07-01 12:00:00 55 B
该表应该连续为每种类型提供15分钟的范围,但您可以在此处输入错过的12:30、12:45、13:00、13:15,错过的11:30和11:45 。因此基于this answer's formula and query。我将做与上一个问题相同的操作,但是这次需要为每种类型填写行。
结果:
dt total type
---------------------------------------
2019-07-01 12:00:00 190 A
2019-07-01 12:15:00 193 A
2019-07-01 12:30:00 x1 A
2019-07-01 12:45:00 x2 A
2019-07-01 13:00:00 x3 A
2019-07-01 13:15:00 x4 A
2019-07-01 13:30:00 202 A
...
2019-07-01 11:00:00 41 B
2019-07-01 11:15:00 46 B
2019-07-01 11:30:00 y1 B
2019-07-01 11:45:00 y2 B
2019-07-01 12:00:00 55 B
需要填写dt中缺少的日期时间,对于总计,将需要根据公式进行计算。以前,我使用已经存在的最新行中的最大值加上x1,x2,.....,y2的平均值。从(202-193)/(4 + 1)= 1.8开始,例如x1等于193 + 1.8 = 194.8,x2等于194.8 + 1.8 = 196.6,依此类推。
有没有关于如何分别为每种类型自动填充的想法?
编辑:
select d.dt, seqnum, d.type,
coalesce(t.total,
(max(t.total) over (order by d.dt asc) +
(min(t.total) over (order by d.dt desc) -
max(t.total) over (order by d.dt asc)
) *
(seqnum - max(seqnum) filter (where t.total is not null) over (order by d.dt asc)) /
nullif(min(seqnum) filter (where t.total is not null) over (order by d.dt desc) -
max(seqnum) filter (where t.total is not null) over (order by d.dt asc),
0
)
)
)
from
(select dt,type, count(*) over (partition by type order by dt) as seqnum
from (
select (generate_series(min(dt), max(dt), interval '15 minute') as dt, type)
from t
) d
) d left join
t
on t.dt = d.dt and t.type = d.type;
这是我当前的代码。我尝试使用仪表分区将每个序列号分隔为每种类型,但是目前出现此错误
ERROR: syntax error at or near "as"
LINE 17: ...te_series(min(dt), max(dt), interval '15 minute') as dt, met...
我认为使用generate_series()的行需要更改与类型相关的内容,以便获得如下所示的seqnum列的结果:
dt total type seqnum
----------------------------------------------------
2019-07-01 12:00:00 190 A 1
2019-07-01 12:15:00 193 A 2
2019-07-01 12:30:00 x1 A 3
2019-07-01 12:45:00 x2 A 4
2019-07-01 13:00:00 x3 A 5
2019-07-01 13:15:00 x4 A 6
2019-07-01 13:30:00 202 A 7
...
2019-07-01 11:00:00 41 B 1
2019-07-01 11:15:00 46 B 2
2019-07-01 11:30:00 y1 B 3
2019-07-01 11:45:00 y2 B 4
2019-07-01 12:00:00 55 B 5