2017-05-09 68 views
1

我有一個表部分#,位置#和日期的庫存數量。如果當天發生變化,表中只有一條記錄。例如:SQL來計算每日平均時,只有變化記錄可用postgresql

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

的各部件/ LOC鍵,我需要計算在 過去3個月的手的平均數量。由於它是2017年5月,我需要計算2017年2月,3月&其中包括顯示的兩條記錄。但我不能只取平均的43和33除以2對於該部分/ LOC的計算值應該是這樣的:

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()來計算日期之間的差異,然後乘以庫存水平,但我無法弄清楚如何從2月1日獲取值,使用以前的更改記錄數量,通過下一個更改記錄。

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

+0

我認爲你的方法來創建一個白天的庫存表,然後從這是合理的平均值。 – Degan

+1

您應該編輯您的問題並顯示您正在使用的查詢。 –

+0

Degan,任何暗示如何創建一個白天的表,包括以前的更改數量,如果新的條目? – bill

回答

0

你可以使用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;