Section 19

Schema Templates

Drop-in SQL for the three layers. Adapt the types to your warehouse.

Bronze

bronze.raw_claims
CREATE TABLE bronze.raw_claims (
  claim_id        VARCHAR,
  member_id       VARCHAR,
  provider_id     VARCHAR,
  service_date    DATE,
  amount_billed   DECIMAL(12,2),
  amount_paid     DECIMAL(12,2),
  status          VARCHAR,
  payload         JSON,
  _source         VARCHAR NOT NULL,
  _loaded_at      TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  _hash           VARCHAR
);

CREATE INDEX ON bronze.raw_claims(_loaded_at);

Silver

silver.claims_clean
CREATE TABLE silver.claims_clean (
  claim_id        VARCHAR PRIMARY KEY,
  member_id       VARCHAR NOT NULL,
  provider_id     VARCHAR NOT NULL,
  service_date    DATE    NOT NULL,
  amount_billed   DECIMAL(12,2) NOT NULL,
  amount_paid     DECIMAL(12,2) NOT NULL,
  net_amount      DECIMAL(12,2) GENERATED ALWAYS AS (amount_billed - amount_paid) STORED,
  status          VARCHAR NOT NULL CHECK (status IN ('paid','denied','pending')),
  is_inpatient    BOOLEAN NOT NULL DEFAULT FALSE,
  _source         VARCHAR NOT NULL,
  _loaded_at      TIMESTAMP NOT NULL,
  _updated_at     TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Gold

gold.claims_summary
CREATE TABLE gold.claims_summary (
  service_month   DATE        NOT NULL,
  provider_id     VARCHAR     NOT NULL,
  claim_count     INTEGER     NOT NULL,
  total_billed    DECIMAL(14,2) NOT NULL,
  total_paid      DECIMAL(14,2) NOT NULL,
  denial_rate     DECIMAL(5,4)  NOT NULL,
  _built_at       TIMESTAMP   NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (service_month, provider_id)
);