251 lines
6.2 KiB
SQL
251 lines
6.2 KiB
SQL
-- Databricks notebook source
|
|
-- MAGIC %md
|
|
-- MAGIC # ATC/NFC DWS hierarchy validation
|
|
-- MAGIC Run this notebook after both DWS hierarchy scripts finish.
|
|
-- MAGIC The DWS outputs and legacy DWD baselines must represent the same source snapshot.
|
|
|
|
-- COMMAND ----------
|
|
|
|
DESCRIBE TABLE dws.dws_ext_td_ims_atc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
DESCRIBE TABLE dws.dws_ext_td_ims_nfc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
-- Fix the comparison column set and order at the view boundary.
|
|
CREATE OR REPLACE TEMP VIEW validation_atc_legacy AS
|
|
SELECT
|
|
ATC1_ID,
|
|
ATC1_CODE,
|
|
ATC1_DES,
|
|
ATC2_ID,
|
|
ATC2_CODE,
|
|
ATC2_DES,
|
|
ATC3_ID,
|
|
ATC3_CODE,
|
|
ATC3_DES,
|
|
ATC4_ID,
|
|
ATC4_CODE,
|
|
ATC4_DES
|
|
FROM dwd.dwd_ims_atc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
CREATE OR REPLACE TEMP VIEW validation_atc_dws AS
|
|
SELECT
|
|
ATC1_ID,
|
|
ATC1_CODE,
|
|
ATC1_DES,
|
|
ATC2_ID,
|
|
ATC2_CODE,
|
|
ATC2_DES,
|
|
ATC3_ID,
|
|
ATC3_CODE,
|
|
ATC3_DES,
|
|
ATC4_ID,
|
|
ATC4_CODE,
|
|
ATC4_DES
|
|
FROM dws.dws_ext_td_ims_atc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
CREATE OR REPLACE TEMP VIEW validation_nfc_legacy AS
|
|
SELECT
|
|
NFC1_ID,
|
|
NFC1_CODE,
|
|
NFC1_DES,
|
|
NFC2_ID,
|
|
NFC2_CODE,
|
|
NFC2_DES,
|
|
NFC3_ID,
|
|
NFC3_CODE,
|
|
NFC3_DES
|
|
FROM dwd.dwd_ims_nfc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
CREATE OR REPLACE TEMP VIEW validation_nfc_dws AS
|
|
SELECT
|
|
NFC1_ID,
|
|
NFC1_CODE,
|
|
NFC1_DES,
|
|
NFC2_ID,
|
|
NFC2_CODE,
|
|
NFC2_DES,
|
|
NFC3_ID,
|
|
NFC3_CODE,
|
|
NFC3_DES
|
|
FROM dws.dws_ext_td_ims_nfc_hierarchy;
|
|
|
|
-- COMMAND ----------
|
|
|
|
CREATE OR REPLACE TEMP VIEW validation_hierarchy_compatibility_checks AS
|
|
WITH compatibility_checks AS (
|
|
SELECT
|
|
'atc_row_count' AS check_name,
|
|
(SELECT COUNT(*) FROM validation_atc_dws) AS actual_value,
|
|
(SELECT COUNT(*) FROM validation_atc_legacy) AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'atc_legacy_minus_dws' AS check_name,
|
|
(
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT * FROM validation_atc_legacy
|
|
EXCEPT ALL
|
|
SELECT * FROM validation_atc_dws
|
|
) AS differences
|
|
) AS actual_value,
|
|
0 AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'atc_dws_minus_legacy' AS check_name,
|
|
(
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT * FROM validation_atc_dws
|
|
EXCEPT ALL
|
|
SELECT * FROM validation_atc_legacy
|
|
) AS differences
|
|
) AS actual_value,
|
|
0 AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_row_count' AS check_name,
|
|
(SELECT COUNT(*) FROM validation_nfc_dws) AS actual_value,
|
|
(SELECT COUNT(*) FROM validation_nfc_legacy) AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_legacy_minus_dws' AS check_name,
|
|
(
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT * FROM validation_nfc_legacy
|
|
EXCEPT ALL
|
|
SELECT * FROM validation_nfc_dws
|
|
) AS differences
|
|
) AS actual_value,
|
|
0 AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_dws_minus_legacy' AS check_name,
|
|
(
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT * FROM validation_nfc_dws
|
|
EXCEPT ALL
|
|
SELECT * FROM validation_nfc_legacy
|
|
) AS differences
|
|
) AS actual_value,
|
|
0 AS expected_value
|
|
UNION ALL
|
|
SELECT
|
|
'except_all_null_semantics' AS check_name,
|
|
(
|
|
SELECT COUNT(*)
|
|
FROM (
|
|
SELECT CAST(NULL AS STRING) AS nullable_value
|
|
EXCEPT ALL
|
|
SELECT CAST(NULL AS STRING) AS nullable_value
|
|
) AS differences
|
|
) AS actual_value,
|
|
0 AS expected_value
|
|
)
|
|
SELECT
|
|
check_name,
|
|
actual_value,
|
|
expected_value,
|
|
actual_value = expected_value AS passed
|
|
FROM compatibility_checks;
|
|
|
|
-- COMMAND ----------
|
|
|
|
SELECT
|
|
check_name,
|
|
actual_value,
|
|
expected_value,
|
|
passed
|
|
FROM validation_hierarchy_compatibility_checks
|
|
ORDER BY check_name;
|
|
|
|
-- COMMAND ----------
|
|
|
|
-- These quality metrics require business review; they do not fail automatically.
|
|
WITH atc_duplicate_paths AS (
|
|
SELECT COUNT(*) AS path_count
|
|
FROM validation_atc_dws
|
|
GROUP BY ATC1_CODE, ATC2_CODE, ATC3_CODE, ATC4_CODE
|
|
HAVING COUNT(*) > 1
|
|
),
|
|
nfc_duplicate_paths AS (
|
|
SELECT COUNT(*) AS path_count
|
|
FROM validation_nfc_dws
|
|
GROUP BY NFC1_CODE, NFC2_CODE, NFC3_CODE
|
|
HAVING COUNT(*) > 1
|
|
)
|
|
SELECT
|
|
'atc_duplicate_path_rows' AS metric_name,
|
|
COALESCE(SUM(path_count - 1), 0) AS metric_value
|
|
FROM atc_duplicate_paths
|
|
UNION ALL
|
|
SELECT
|
|
'atc_source_level_1_required_key_null' AS metric_name,
|
|
COUNT_IF(therapeutic_id IS NULL OR therapeutic_code IS NULL) AS metric_value
|
|
FROM dwd.dwd_ims_td_therapeutic_class
|
|
WHERE therapeutic_level = '1'
|
|
UNION ALL
|
|
SELECT
|
|
'atc_unmatched_level_2' AS metric_name,
|
|
COUNT_IF(ATC2_CODE IS NULL) AS metric_value
|
|
FROM validation_atc_dws
|
|
UNION ALL
|
|
SELECT
|
|
'atc_unmatched_level_3' AS metric_name,
|
|
COUNT_IF(ATC3_CODE IS NULL) AS metric_value
|
|
FROM validation_atc_dws
|
|
UNION ALL
|
|
SELECT
|
|
'atc_unmatched_level_4' AS metric_name,
|
|
COUNT_IF(ATC4_CODE IS NULL) AS metric_value
|
|
FROM validation_atc_dws
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_duplicate_path_rows' AS metric_name,
|
|
COALESCE(SUM(path_count - 1), 0) AS metric_value
|
|
FROM nfc_duplicate_paths
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_source_level_1_required_key_null' AS metric_name,
|
|
COUNT_IF(newformclass_id IS NULL OR newformclass_code IS NULL) AS metric_value
|
|
FROM dwd.dwd_ims_td_new_form_class
|
|
WHERE newformclass_level = '1'
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_unmatched_level_2' AS metric_name,
|
|
COUNT_IF(NFC2_CODE IS NULL) AS metric_value
|
|
FROM validation_nfc_dws
|
|
UNION ALL
|
|
SELECT
|
|
'nfc_unmatched_level_3' AS metric_name,
|
|
COUNT_IF(NFC3_CODE IS NULL) AS metric_value
|
|
FROM validation_nfc_dws
|
|
ORDER BY metric_name;
|
|
|
|
-- COMMAND ----------
|
|
|
|
-- Block downstream migration when any DWS-to-DWD compatibility check fails.
|
|
SELECT IF(
|
|
COUNT_IF(NOT passed) = 0,
|
|
'All DWS hierarchy compatibility checks passed.',
|
|
raise_error(
|
|
CONCAT(
|
|
'DWS hierarchy compatibility validation failed: ',
|
|
CAST(COUNT_IF(NOT passed) AS STRING),
|
|
' check(s) did not pass.'
|
|
)
|
|
)
|
|
) AS validation_result
|
|
FROM validation_hierarchy_compatibility_checks;
|