【问题标题】:sql to calculate the daily avg when only change records are available in postgresql当postgresql中只有更改记录可用时,sql计算每日平均值
【发布时间】:2017-05-09 15:41:08
【问题描述】:

我有一张按零件编号、位置编号和日期列出的库存数量表。如果当天发生更改,则表中只有一条记录。例如:

part  |loc   |date      |qtyonhand
------+------+----------+---------
10544 | 3012 | 20161116 | 68
10544 | 3012 | 20170403 | 43  <----- 
10544 | 3012 | 20170413 | 33  <-----

对于每个零件/位置键,我需要计算手头上的平均数量 过去 3 个月。由于是 2017 年 5 月,我需要计算 2017 年 2 月、3 月和 4 月,其中包括显示的两条记录。但我不能只取 43 和 33 除以 2 的平均值。对于这部分/位置,计算应该是这样的:

20170201 inventory was 68
20170202 inventory was 68
...for each day
20170402 inventory was 68
20170403 inventory was 43
20170404 inventory was 43
...
20170413 inventory was 33
...
20170430 inventory was 33

我将每天的库存相加,然后除以 2 月 1 日到 4 月 30 日之间的天数。

我尝试使用 lag() 来计算日期之间的差异,然后将其乘以库存水平,但我无法弄清楚如何使用之前的更改记录 qty 获取 2 月 1 日的值,通过下一条变更记录。

非常感谢任何提示或方向。

【问题讨论】:

  • 我认为您按天创建库存表然后汇总平均值的方法是合理的。
  • 您应该编辑您的问题并显示您正在处理的查询。
  • Degan,关于如何按天创建包含先前更改数量的表(如果新条目)的任何提示?

标签: sql postgresql


【解决方案1】:

您可以使用lag() 和句点上的逻辑来执行此操作。如果我有算术权:

select part, loc, 
       sum(days_in_period * prev_quantity)/ sum(days_in_period) as average
from (select t.*,
             greatest(least(date, period_end) - greatest(prev_date, period_start) + 1, 0) as days_in_period
      from (select t.*,
                   lag(date) over (partition by part, loc order by date) as prev_date,
                   lag(qtyonhand) over (partition by part, loc order by date) as prev_qtyonhand
            from t
           ) t cross join
           (select '2017-02-01'::date as period_start, '2017-04-30'::date as period_end,
     ) t
group by part, loc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2019-03-07
    • 1970-01-01
    • 2020-06-04
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    相关资源
    最近更新 更多