SQL Library

Queries tied to real analytical questions, transformations and quality checks.

Joins

Paired-series self-join — Bitumen Gap

Related project →

Purpose: Pair including/excluding-bitumen versions of the same road activity and period.

SELECT i.activity, i.pct_yoy AS incl_bitumen, e.pct_yoy AS excl_bitumen,
       ROUND(e.pct_yoy - i.pct_yoy, 1) AS gap_pp
FROM civil_material_index i
JOIN civil_material_index e
  ON e.activity=i.activity AND e.period=i.period
 AND e.bitumen_treatment='excluded'
WHERE i.bitumen_treatment='included'
  AND i.period='2025-10'
ORDER BY gap_pp DESC;
Window functions

Rolling material volatility

Related project →

Purpose: Create YoY movement and 12-month rolling volatility without altering the official series.

WITH x AS (
  SELECT series_code, period, index_value,
         100.0*(index_value/LAG(index_value,12) OVER (PARTITION BY series_code ORDER BY period)-1) AS yoy_pct
  FROM material_index
)
SELECT series_code, period, yoy_pct,
       STDDEV_SAMP(yoy_pct) OVER (PARTITION BY series_code ORDER BY period ROWS BETWEEN 11 PRECEDING AND CURRENT ROW) AS vol_12m
FROM x;
Forecast features

Asphalt demand-pressure aggregation

Related project →

Purpose: Aggregate intensity-weighted road-project signals by month without using contract monetary values.

SELECT date_trunc('month', tender_start) AS month,
       SUM(asphalt_intensity_score) AS pressure_points,
       COUNT(*) FILTER (WHERE asphalt_intensity_score >= 0.75) AS high_intensity_projects
FROM road_pipeline
WHERE province='Western Cape'
GROUP BY 1
ORDER BY 1;
Process analytics

Procurement cycle-time analysis

Related project →

Purpose: Measure median tender-to-award time by civil work type.

SELECT work_type,
       COUNT(*) AS processes,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY award_date-tender_start) AS median_days_to_award
FROM contracting_process_latest
WHERE sector='Civil infrastructure' AND award_date IS NOT NULL
GROUP BY work_type
ORDER BY processes DESC;
Information management

Information bottleneck query

Related project →

Purpose: Identify packages with old unresolved RFIs using a robust median age metric.

SELECT package_code,
       COUNT(*) FILTER (WHERE status='Open') AS open_rfis,
       PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY current_date-created_date)
         FILTER (WHERE status='Open') AS median_open_age_days
FROM rfi_fact
GROUP BY package_code
ORDER BY median_open_age_days DESC;
Data quality

Source reliability summary

Related project →

Purpose: Summarise last check, last success and recent failures for every data source.

SELECT source_id, MAX(checked_at) AS last_check,
       MAX(checked_at) FILTER (WHERE status='ok') AS last_success,
       COUNT(*) FILTER (WHERE status<>'ok' AND checked_at>current_timestamp-interval '7 days') AS failures_7d
FROM source_run
GROUP BY source_id;
OCDS / window functions

Latest procurement release per OCID

Related project →

Purpose: Keep release history but select the latest state of each contracting process for analysis.

WITH ranked AS (
  SELECT ocid, release_date, raw_json,
         ROW_NUMBER() OVER (PARTITION BY ocid ORDER BY release_date DESC, release_key DESC) AS rn
  FROM etender_release
)
SELECT * FROM ranked WHERE rn = 1;
Procurement analytics

Western Cape asphalt-intensity pipeline

Related project →

Purpose: Count classified road processes by stage and likely asphalt intensity without using tender monetary values.

SELECT stage, asphalt_intensity, COUNT(*) AS processes
FROM etender_process_latest
WHERE is_western_cape = TRUE
  AND sector = 'Roads / pavement'
GROUP BY stage, asphalt_intensity
ORDER BY stage, asphalt_intensity;
Project Controls / window functions

Latest project-control snapshot per activity

Related project →

Purpose: Select the latest state of every activity while retaining the monthly snapshot history.

WITH ranked AS (\n SELECT *, ROW_NUMBER() OVER(PARTITION BY activity_id ORDER BY snapshot_date DESC) rn\n FROM project_control_snapshot\n)\nSELECT * FROM ranked WHERE rn=1;
Project Controls / window functions

Activities losing float month-on-month

Related project →

Purpose: Identify activities whose float is deteriorating between reporting periods.

SELECT activity_id, snapshot_date, total_float_days,\n total_float_days - LAG(total_float_days) OVER(PARTITION BY activity_id ORDER BY snapshot_date) AS float_change_days\nFROM project_control_snapshot;
Data Quality / UAT

Validation status by analytical area

Related project →

Purpose: Summarise PASS/WARN/FAIL results without hiding warnings.

SELECT area, status, COUNT(*) AS tests\nFROM validation_result\nGROUP BY area, status\nORDER BY area, status;