1日の在庫残高を計算するために次のクエリを思いつきました。クエリが機能し、予想される結果が得られますが、約2mio行のトランザクションテーブルのサブセットで実行するには200秒以上かかります。 bigqueryに新しいこと私はこれを行うためのより良い/より効率的な方法があるのだろうかと思いますか?bigqueryに関するこの日常の在庫バランス計算を改善することができます
いくつかのサンプルデータを含むコードは以下のとおりです。 ご迷惑をおかけして申し訳ありません。
#### Generate a continuous date range
WITH days AS
(
SELECT day
FROM UNNEST(
GENERATE_DATE_ARRAY(DATE('2011-01-01'), CURRENT_DATE(), INTERVAL 1 DAY)) AS day
),
#### Transactional information of inventory movements. Simple example
movements AS
(
SELECT 1 AS ItemID
,1 AS Location
,DATE('2017-12-01') AS TransactionDate
,0 AS Quantity
UNION ALL SELECT 1, 1, DATE('2017-12-03'), 10
UNION ALL SELECT 1, 1, DATE('2017-12-06'), 100
UNION ALL SELECT 1, 1, DATE('2017-12-12'), 1000
),
#### Calculate cumulative sum for each item and location based on the transaction date
cumsum AS
(
SELECT ItemID
,TransactionDate
,Location
,SUM(Quantity) OVER (PARTITION BY ItemID, Location ORDER BY TransactionDate ROWS UNBOUNDED PRECEDING) as cumulative_quantity
FROM movements
),
#### Cross join with the date range to backfill cumulative values for each day
#### This will return multiple lines for a day when there are multiple transaction date balances
cross_sum AS
(
SELECT m.ItemID
,m.Location
,d.day
,m.TransactionDate
,m.cumulative_quantity
FROM days d
CROSS JOIN cumsum m
WHERE m.TransactionDate <= d.day
),
#### Get just one line per day, based on the latest transaction date
filtered AS
(
SELECT ItemID
,Location
,CAST (day AS datetime) AS BalanceDate
,ARRAY_AGG(cumulative_quantity ORDER BY TransactionDate DESC LIMIT 1) AS InventoryBalance
FROM cross_sum
GROUP BY 1,2,3
)
#### Final result, flattened out
SELECT ItemID
,Location
,BalanceDate
,(SELECT SUM(InventoryBalance) FROM UNNEST(InventoryBalance) AS InventoryBalance) AS InventoryBalance
FROM filtered
ORDER BY 1,2,3
で試してみて、それがあるかどうかを見る必要があります - あなたが持っています同じ日付、アイテム、場所の複数のエントリ?コメントはトランザクション情報だと言いますが、コードは既に項目別にグループ化されていると想定しているため、場所、日付、および例はこれに準拠しています。 @MikhailBerlyantをご覧いただきありがとうございます。 –
はい。ソーステーブルは実際にはトランザクション型で、同じ日付、項目、場所に対して複数のエントリを持ち、 'movements'テーブルはそれらの属性にグループ分けされています。なぜなら私たちは個々の日中の変化は気にしません。例は、データがグループ化されていることを反映しています。それを明確にする希望。 – PowdyPowPow