s4/UpdateStockMonthlySnapshots.sql (303 lines of code) (raw):

# Copyright 2023 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Update (refresh) stock monthly snapshots table for records between provided dates (inclusive). # # `monthly_inventory_aggregation` table must be up to date before calling this function. # # @param start_date Starting date of refresh. Must be the first day of a month. # @param end_date Ending date of refresh. Must be later than start_date. CREATE OR REPLACE PROCEDURE `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.UpdateStockMonthlySnapshots` ( start_date DATE, end_date DATE ) OPTIONS (description = "This procedure updates the 'stock_monthly_snapshots' table by passing the parameters 'start_date' and 'end_date'.") BEGIN CREATE TEMP TABLE LastMonthSnapshot AS SELECT * EXCEPT ( month_end_date, cal_year, cal_month ), LAST_DAY(start_date, MONTH) AS month_end_date, EXTRACT(YEAR FROM start_date) AS cal_year, EXTRACT(MONTH FROM start_date) AS cal_month FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_monthly_snapshots` WHERE month_end_date = DATE_SUB(start_date, INTERVAL 1 DAY); CREATE TEMP TABLE CurrentPeriodMovements AS SELECT * FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.monthly_inventory_aggregation` WHERE month_end_date BETWEEN start_date AND end_date; CREATE TEMP TABLE AllMaterialCombinations AS SELECT DISTINCT * FROM ( SELECT mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers FROM LastMonthSnapshot UNION ALL SELECT mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers FROM CurrentPeriodMovements ); DELETE FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_monthly_snapshots` WHERE month_end_date BETWEEN start_date AND end_date; INSERT INTO `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_monthly_snapshots` ( mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, cal_year, cal_month, meins, bstaus_sg, waers, month_end_date, total_monthly_movement_quantity, total_monthly_movement_amount, amount_monthly_cumulative, quantity_monthly_cumulative ) WITH DateDim AS ( SELECT DISTINCT calyear AS cal_year, calmonth AS cal_month, monthenddate AS month_end_date FROM `{{ project_id_src }}.{{ k9_datasets_processing }}.calendar_date_dim` WHERE date BETWEEN start_date AND end_date ), MonthlyCumulativeRaw AS ( SELECT month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers, total_monthly_movement_amount, -- noqa: RF02 total_monthly_movement_quantity -- noqa: RF02 -- this ensures all month / material combinations exist even if -- they don’t exist in current movements FROM DateDim CROSS JOIN AllMaterialCombinations LEFT JOIN CurrentPeriodMovements USING ( month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers ) UNION ALL -- take balance of last month and treat it as beginning balance of the first month SELECT month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers, amount_monthly_cumulative AS total_monthly_movement_amount, quantity_monthly_cumulative AS total_monthly_movement_quantity FROM LastMonthSnapshot ), MonthlyCumulative AS ( SELECT month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers, SUM(total_monthly_movement_quantity) AS total_monthly_movement_quantity_sum, SUM(total_monthly_movement_amount) AS total_monthly_movement_amount_sum FROM MonthlyCumulativeRaw GROUP BY month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers ) SELECT mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, cal_year, cal_month, meins, bstaus_sg, waers, month_end_date, COALESCE(total_monthly_movement_quantity, 0) AS total_monthly_movement_quantity, -- noqa: RF02 COALESCE(total_monthly_movement_amount, 0) AS total_monthly_movement_amount, -- noqa: RF02 SUM(total_monthly_movement_amount_sum) -- noqa: RF02 OVER ( PARTITION BY mandt, matnr, werks, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers ORDER BY month_end_date ASC ROWS UNBOUNDED PRECEDING ) AS amount_monthly_cumulative, SUM(total_monthly_movement_quantity_sum) -- noqa: RF02 OVER ( PARTITION BY mandt, matnr, werks, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers ORDER BY month_end_date ASC ROWS UNBOUNDED PRECEDING ) AS quantity_monthly_cumulative FROM MonthlyCumulative LEFT JOIN CurrentPeriodMovements USING ( month_end_date, cal_year, cal_month, mandt, werks, matnr, charg, lgort, bukrs, bwart, insmk, sobkz, shkzg, meins, bstaus_sg, waers ) QUALIFY amount_monthly_cumulative IS NOT NULL OR quantity_monthly_cumulative IS NOT NULL; END;