根据时间范围分别为每种类型自动填充缺少的行

时间:2019-07-31 14:58:51

标签: python sql postgresql

此问题从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

0 个答案:

没有答案