2017-05-09 4 views
1

部品番号、場所、日付で在庫数の表があります。その日に変更が発生した場合は、テーブルにレコードのみが存在します。たとえば、次の各部/ LOCキーについてpostgresqlで変更レコードのみが使用可能な場合の日単位の平均を計算するSQL

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

、Iは 過去3ヶ月にわたって手で平均量を計算する必要があります。 2017年5月以降、2月には、& 4月2017の2つのレコードが表示されます。しかし、私はちょうどCalcはこのようにする必要があり、この部分/ LOCのために2で割った43と33の平均を取ることができない。

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日から値を取得する方法がわかりません前の変更レコードqtyを次の変更レコードを介して返します。

どのようなヒントや方向性も高く評価されています。

+0

私は日ごとに目録のテーブルを作成し、それから平均を集計するあなたの方法は合理的だと思います。 – Degan

+1

質問を編集して、作業中のクエリを表示する必要があります。 –

+0

Degan、新しいエントリーの場合、前の変更数量を含む1日あたりのテーブルの作成方法に関するヒント? – 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; 
関連する問題