PostgreSQL使用前几行的计算值进行计算

PostgreSQL使用前几行的计算值进行计算,postgresql,Postgresql,我需要解决的问题是: 为了计算用于公共假日或疾病天数的每天小时数,使用前3个月的平均工作时间,起始值为每天8小时 棘手的是,上个月的计算值需要考虑在内,这意味着如果上个月有公共假日,其计算值为8.5小时,这些计算小时将影响上个月每天的平均工作时间,然后用于为当前月份的假期分配工作时间 到目前为止,我只提出了以下几点,还没有考虑到逐行计算: 具有 常数h_目标,h_额外值为8.0,20, 月总c_月、d_工作、d_关闭、h_工作作为值 '2018-12', 16, 5, 150.25, '2019

我需要解决的问题是:

为了计算用于公共假日或疾病天数的每天小时数,使用前3个月的平均工作时间,起始值为每天8小时

棘手的是,上个月的计算值需要考虑在内,这意味着如果上个月有公共假日,其计算值为8.5小时,这些计算小时将影响上个月每天的平均工作时间,然后用于为当前月份的假期分配工作时间

到目前为止,我只提出了以下几点,还没有考虑到逐行计算:

具有 常数h_目标,h_额外值为8.0,20, 月总c_月、d_工作、d_关闭、h_工作作为值 '2018-12', 16, 5, 150.25, '2019-01', 20, 3, 171.25, '2019-02', 15, 5, 120.5 , 计算为 选择 杨洁篪女士, ms.d_工作+ms.d_关闭作为d_总数, ms.h_工作+ms.d_关闭*常量h_目标作为h_总数, avgms.h_工作+ms.d_关闭*const.h_目标/ms.d_工作+ms.d_关闭 ms.c_月份行在前两行和当前行之间的超额订单::numeric10,2 当你离开时 从每月的金额中取ms 交叉连接常数 选择 计算月, 计算工作, 计算出, 计算d_总计, 计算h_工作, calc.h_off, d_off*lagh_off,1,const.h_目标超过订单个月,作为h_off_总和, h_工作+d_关闭*滞后,1,以c_月为h_总和超过订单的常数h_目标 从计算交叉连接常数; …给出以下结果:

 c_month | d_work | d_off | d_total | h_work | h_off | h_off_sum | h_sum  
---------+--------+-------+---------+--------+-------+-----------+--------
 2018-12 |     16 |     5 |      21 | 150.25 |  9.06 |      40.0 | 190.25
 2019-01 |     20 |     3 |      23 | 171.25 |  8.77 |     27.18 | 198.43
 2019-02 |     15 |     5 |      20 |  120.5 |  8.52 |     43.85 | 164.35
(3 rows)
对于依赖于前一行值滞后的列,第一行和第二行的计算是正确的,但每天平均小时数的计算显然是错误的,因为我无法找出如何将当前行值h_总和反馈到新h_off的计算中

预期结果应如下所示:

 c_month | d_work | d_off | d_total | h_work | h_off | h_off_sum | h_sum  
---------+--------+-------+---------+--------+-------+-----------+--------
 2018-12 |     16 |     5 |      21 | 150.25 |  9.06 |      40.0 | 190.25
 2019-01 |     20 |     3 |      23 | 171.25 |  8.84 |     27.18 | 198.43
 2019-02 |     15 |     5 |      20 |  120.5 |  8.64 |      44.2 |  164.7
(3 rows)
…意味着h_off用于下一个月的h_off_sum,所得的h_sum和可用月份的h_sum最多三个,依次计算当前月份的h_off,基本上是三个月内的平均h_sum/d_总数

因此,实际计算为:

 c_month | calculation                                        | h_off
---------+----------------------------------------------------+-------
         |                                                    |  8.00 << initial
               .---------------------- uses ---------------------^
 2018-12 | ((190.25 / 21)) / 1                                |  9.06
                               .------------ uses ---------------^
 2019-01 | ((190.25 / 21) + (198.43 / 23)) / 2                |  8.84
                                               .--- uses --------^
 2019-02 | ((190.25 / 21) + (198.43 / 23) + (164.7 / 20)) / 3 |  8.64

注:我正在使用PostgreSQL 11,因此,如果这有什么不同的话,我手头有最新的功能。

我根本无法解决使用的列间+行间计算问题,而且必须回到a的特殊用途,以及为历史第三个月的d_total_1天和h_sum_1小时引入特殊用途列不能多次加入递归临时表

此外,我在输入数据中添加了第4行,并使用了一个附加的索引列,我可以在加入时参考它,它通常由如下子查询组成:

选择按c_月排序的订单上的行数作为行数,*从月度总和中选择 因此,以下是我的看法:

以递归计算为例 选择 每月金额。行数, 每月金额, 每月工作总结, 每月一次的总结, 每月的工作总结, 每月的金额。d金额*8::数字10,2作为h金额, 每月金额d_工作+每月金额d_总金额, 0.0作为d_总计_1, 月度金额。月度工作+月度金额。d金额*8::数字10,2作为月度金额, 0.0作为h_sum_1, 每月金额。h金额+每月金额。d金额*8 / 每月总结工作+每月总结工作 ::数字10,2作为h_off 从…起 从值中选择* 1, '2018-12', 16, 5, 150.25, 2, '2019-01', 20, 3, 171.25, 3, '2019-02', 15, 5, 120.5, 4, '2019-03', 19, 2, 131.75 作为tmp行数,c月,d工作,d工作,h工作 作为每月的金额 哪里 每月金额。行数=1 联合所有 选择 每月金额。行数, 每月金额, 每月工作总结, 每月一次的总结, 每月的工作总结, lat_off.h_off_sum::数值10,2, lat_天数d_总计, 计算d_总计为d_总计1, lat_sum.h_sum::数值10,2, 计算h_sum为h_sum 1, 横向计算关闭::数值10,2 从…起 从值中选择* 1, '2018-12', 16, 5, 150.25, 2, '2019-01', 20, 3, 171.25, 3, '2019-02', 15, 5, 120.5, 4, '2019-03', 19, 2, 131.75 作为tmp行数,c月,d工作,d工作,h工作 作为每月的金额 计算行上的内部联接计算数量=每月 两个位置的列的显式类型

谜题的最后一部分是通过使用子查询解决的,这使我能够有一个计算引用上一个计算的结果,甚至可以在最终输出中不依赖于计算层次结构的列之间移动

如果有人能想出一个更简单的变体,我很乐意了解它

 c_month | d_work | d_off | d_total | h_work | h_off | h_off_sum | h_sum  
---------+--------+-------+---------+--------+-------+-----------+--------
 2018-12 |     16 |     5 |      21 | 150.25 |  9.06 |     40.00 | 190.25
 2019-01 |     20 |     3 |      23 | 171.25 |  8.83 |     27.18 | 198.43
 2019-02 |     15 |     5 |      20 |  120.5 |  8.65 |     44.15 | 164.65
 2019-03 |     19 |     2 |      21 | 131.75 |  8.00 |     17.30 | 149.05
(4 rows)