ecc/UpdateStockWeeklySnapshots.sql (260 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 weekly snapshots table for records between provided dates (inclusive). # # `weekly_inventory_aggregation` table must be up to date before calling this function. # Week start date is defined in the Calendar Date Dimension table (`calendar_date_dim`). # # @param start_date Starting date of refresh. Must be the first day of a week. # @param end_date Ending date of refresh. Must be later than start_date. CREATE OR REPLACE PROCEDURE `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.UpdateStockWeeklySnapshots` ( start_date DATE, end_date DATE ) OPTIONS (description = "This procedure updates the 'stock_weekly_snapshots' table by passing the parameters 'start_date' and 'end_date'.") BEGIN CREATE TEMP TABLE LastWeekSnapshot AS SELECT * EXCEPT ( week_end_date, cal_year, cal_week ), LAST_DAY(start_date, WEEK) AS week_end_date, EXTRACT(YEAR FROM start_date) AS cal_year, EXTRACT(WEEK FROM start_date) AS cal_week FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_weekly_snapshots` WHERE week_end_date = DATE_SUB(LAST_DAY(start_date, WEEK), INTERVAL 1 WEEK) AND --skip last incomplete week of the year - will be handled separately EXTRACT(YEAR FROM week_end_date) = cal_year; CREATE TEMP TABLE CurrentPeriodMovements AS SELECT * FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.weekly_inventory_aggregation` WHERE week_end_date BETWEEN start_date AND end_date -- # only include weeks that ends within the current year -- # skip last incomplete week of the year - will be handled separately -- # i.e. include week 0 till week 51/52 where the last week is complete. AND EXTRACT(YEAR FROM week_end_date) = cal_year; CREATE TEMP TABLE AllMaterialCombinations AS SELECT DISTINCT * FROM ( SELECT mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic FROM LastWeekSnapshot UNION ALL SELECT mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic FROM CurrentPeriodMovements ); DELETE FROM `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_weekly_snapshots` WHERE week_end_date BETWEEN start_date AND LAST_DAY(end_date, WEEK); INSERT INTO `{{ project_id_tgt }}.{{ dataset_reporting_tgt }}.stock_weekly_snapshots` ( mandt, werks, matnr, charg, lgort, bukrs, cal_year, cal_week, meins, waers, stock_characteristic, week_end_date, total_weekly_movement_quantity, total_weekly_movement_amount, amount_weekly_cumulative, quantity_weekly_cumulative ) WITH DateDim AS ( SELECT DISTINCT -- Fix incorrect cal_year and cal_week numbers weekEndDate AS week_end_date, EXTRACT(YEAR FROM weekEndDate) AS cal_year, EXTRACT(WEEK FROM weekEndDate) AS cal_week FROM `{{ project_id_src }}.{{ k9_datasets_processing }}.calendar_date_dim` WHERE date BETWEEN start_date AND end_date ), WeeklyCumulativeRaw AS ( SELECT week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic, total_weekly_movement_amount, -- noqa: RF02 total_weekly_movement_quantity -- noqa: RF02 -- # this ensures all week / material combinations exist even if they -- # don’t exist in current movements FROM DateDim CROSS JOIN AllMaterialCombinations LEFT JOIN CurrentPeriodMovements USING ( week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic ) UNION ALL --# take balance of last week and treat it as beginning balance --# of the first week SELECT week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic, amount_weekly_cumulative AS total_weekly_movement_amount, quantity_weekly_cumulative AS total_weekly_movement_quantity FROM LastWeekSnapshot ), WeeklyCumulative AS ( SELECT week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic, SUM(total_weekly_movement_quantity) AS total_weekly_movement_quantity_sum, SUM(total_weekly_movement_amount) AS total_weekly_movement_amount_sum FROM WeeklyCumulativeRaw GROUP BY week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic ) SELECT mandt, werks, matnr, charg, lgort, bukrs, cal_year, cal_week, meins, waers, stock_characteristic, week_end_date, COALESCE(total_weekly_movement_quantity, 0) AS total_weekly_movement_quantity, -- noqa: RF02 COALESCE(total_weekly_movement_amount, 0) AS total_weekly_movement_amount, -- noqa: RF02 SUM(total_weekly_movement_amount_sum) OVER ( -- noqa: RF02 PARTITION BY mandt, matnr, werks, charg, lgort, bukrs, meins, waers, stock_characteristic ORDER BY week_end_date ASC ROWS UNBOUNDED PRECEDING ) AS amount_weekly_cumulative, SUM(total_weekly_movement_quantity_sum) OVER ( -- noqa: RF02 PARTITION BY mandt, matnr, werks, charg, lgort, bukrs, meins, waers, stock_characteristic ORDER BY week_end_date ASC ROWS UNBOUNDED PRECEDING ) AS quantity_weekly_cumulative FROM WeeklyCumulative LEFT JOIN CurrentPeriodMovements USING ( week_end_date, cal_year, cal_week, mandt, werks, matnr, charg, lgort, bukrs, meins, waers, stock_characteristic ) QUALIFY amount_weekly_cumulative IS NOT NULL OR quantity_weekly_cumulative IS NOT NULL; END;