initial commit
This commit is contained in:
@@ -0,0 +1,138 @@
|
||||
/*
|
||||
Baseline vs rolling evaluation template
|
||||
=======================================
|
||||
|
||||
Purpose:
|
||||
Compare a fixed baseline cohort with rolling evaluation periods.
|
||||
|
||||
Typical use:
|
||||
- A medicines optimisation search where the baseline is fixed.
|
||||
- Later periods check whether the same patients still meet criteria.
|
||||
- Output is practice x period, preserving the baseline count.
|
||||
|
||||
Replace medicine_products and the evaluation criteria before use.
|
||||
*/
|
||||
|
||||
SET BASELINE_START = '2025-04-01';
|
||||
SET BASELINE_END = '2025-06-30';
|
||||
SET FIRST_EVALUATION_START = '2025-04-01';
|
||||
SET EVALUATION_MONTHS = 3;
|
||||
SET BNF_PREFIX = 'REPLACE_WITH_BNF_PREFIX';
|
||||
|
||||
WITH latest_prescribing_date AS (
|
||||
-- Caps generated periods to data already present in the prescribing table.
|
||||
SELECT MAX("DateMedicationStart")::DATE AS "MaxDate"
|
||||
FROM REPORTING_DATASETS_ICB.SCRATCHPAD."MEDS__UnifiedPrescribingTable"
|
||||
WHERE "DateMedicationStart" <= CURRENT_DATE()
|
||||
),
|
||||
periods AS (
|
||||
-- Generates candidate month starts; increase ROWCOUNT for longer projects.
|
||||
SELECT
|
||||
ROW_NUMBER() OVER (ORDER BY SEQ4()) AS "PeriodNumber",
|
||||
DATEADD(MONTH, ROW_NUMBER() OVER (ORDER BY SEQ4()) - 1, $FIRST_EVALUATION_START::DATE)::DATE AS "PeriodStartDate"
|
||||
FROM TABLE(GENERATOR(ROWCOUNT => 48))
|
||||
),
|
||||
evaluation_periods AS (
|
||||
SELECT
|
||||
"PeriodNumber",
|
||||
"PeriodStartDate",
|
||||
LAST_DAY(DATEADD(MONTH, $EVALUATION_MONTHS - 1, "PeriodStartDate"))::DATE AS "PeriodEndDate"
|
||||
FROM periods
|
||||
CROSS JOIN latest_prescribing_date
|
||||
WHERE "PeriodStartDate" <= "MaxDate"
|
||||
),
|
||||
date_bounds AS (
|
||||
SELECT
|
||||
$BASELINE_START::DATE AS "MinEventDate",
|
||||
GREATEST($BASELINE_END::DATE, COALESCE(MAX("PeriodEndDate"), $BASELINE_END::DATE)) AS "MaxEventDate"
|
||||
FROM evaluation_periods
|
||||
),
|
||||
practices AS (
|
||||
-- Default to active Norfolk and Suffolk parent GP practices.
|
||||
SELECT DISTINCT
|
||||
"OrganisationCode" AS "PracticeCode",
|
||||
"OrganisationName" AS "PracticeName"
|
||||
FROM DATA_HUB.DWH."DimOrganisationAndSite"
|
||||
WHERE "OrganisationSubType" = 'GP Practice'
|
||||
AND "IsSiteActive" = 'Yes'
|
||||
AND "IsSiteNorfolkAndSuffolk" = 'Yes'
|
||||
AND "SiteCode" = "OrganisationCode"
|
||||
),
|
||||
medicine_products AS (
|
||||
-- Replace this CTE for VTM, VMP, explicit SNOMED, or cluster-based definitions.
|
||||
SELECT DISTINCT "ProductSnomedCode"
|
||||
FROM DATA_HUB.DWH."DimMedicineAndDevice"
|
||||
WHERE "BNFCode" LIKE $BNF_PREFIX || '%'
|
||||
),
|
||||
medicine_events AS (
|
||||
-- Pull the smallest event window needed for both baseline and evaluation.
|
||||
SELECT DISTINCT
|
||||
rx."PersonKey",
|
||||
rx."CurrentGeneralPractice" AS "PracticeCode",
|
||||
rx."DateMedicationStart"
|
||||
FROM REPORTING_DATASETS_ICB.SCRATCHPAD."MEDS__UnifiedPrescribingTable" rx
|
||||
CROSS JOIN date_bounds db
|
||||
INNER JOIN medicine_products mp
|
||||
ON rx."SNOMEDCode" = mp."ProductSnomedCode"
|
||||
WHERE rx."PersonKey" IS NOT NULL
|
||||
AND rx."CurrentGeneralPractice" IS NOT NULL
|
||||
AND rx."DateMedicationStart" BETWEEN db."MinEventDate" AND db."MaxEventDate"
|
||||
),
|
||||
baseline_cohort AS (
|
||||
-- Fixes each patient to the practice recorded during the baseline window.
|
||||
SELECT DISTINCT
|
||||
me."PersonKey",
|
||||
me."PracticeCode"
|
||||
FROM medicine_events me
|
||||
WHERE me."DateMedicationStart" BETWEEN $BASELINE_START AND $BASELINE_END
|
||||
),
|
||||
baseline_counts AS (
|
||||
SELECT
|
||||
"PracticeCode",
|
||||
COUNT(DISTINCT "PersonKey") AS "BaselineCount"
|
||||
FROM baseline_cohort
|
||||
GROUP BY "PracticeCode"
|
||||
),
|
||||
practice_periods AS (
|
||||
-- Ensures every active practice returns one row per evaluation period.
|
||||
SELECT
|
||||
p."PracticeCode",
|
||||
p."PracticeName",
|
||||
ep."PeriodNumber",
|
||||
ep."PeriodStartDate",
|
||||
ep."PeriodEndDate"
|
||||
FROM practices p
|
||||
CROSS JOIN evaluation_periods ep
|
||||
),
|
||||
evaluation_counts AS (
|
||||
SELECT
|
||||
bc."PracticeCode",
|
||||
ep."PeriodNumber",
|
||||
ep."PeriodStartDate",
|
||||
ep."PeriodEndDate",
|
||||
COUNT(DISTINCT me."PersonKey") AS "EvaluationCount"
|
||||
FROM baseline_cohort bc
|
||||
CROSS JOIN evaluation_periods ep
|
||||
LEFT JOIN medicine_events me
|
||||
ON me."PersonKey" = bc."PersonKey"
|
||||
AND me."DateMedicationStart" BETWEEN ep."PeriodStartDate" AND ep."PeriodEndDate"
|
||||
GROUP BY bc."PracticeCode", ep."PeriodNumber", ep."PeriodStartDate", ep."PeriodEndDate"
|
||||
)
|
||||
SELECT
|
||||
pp."PracticeCode",
|
||||
pp."PracticeName",
|
||||
pp."PeriodNumber",
|
||||
pp."PeriodStartDate",
|
||||
pp."PeriodEndDate",
|
||||
COALESCE(bc."BaselineCount", 0) AS "BaselineCount",
|
||||
COALESCE(ec."EvaluationCount", 0) AS "EvaluationCount",
|
||||
COALESCE(bc."BaselineCount", 0) - COALESCE(ec."EvaluationCount", 0) AS "ReductionFromBaseline"
|
||||
FROM practice_periods pp
|
||||
LEFT JOIN baseline_counts bc
|
||||
ON pp."PracticeCode" = bc."PracticeCode"
|
||||
LEFT JOIN evaluation_counts ec
|
||||
ON pp."PracticeCode" = ec."PracticeCode"
|
||||
AND pp."PeriodNumber" = ec."PeriodNumber"
|
||||
ORDER BY
|
||||
pp."PracticeName",
|
||||
pp."PeriodNumber";
|
||||
Reference in New Issue
Block a user