# PBP renal dialysis (cleaned view)

`medicare_semantic.vw_pbp_renal_dialysis` · Medicare Advantage, Part D, Medicaid · status live

Cleaned source-faithful PBP renal dialysis rows: era-normalized, CMS codes decoded, with offered_status/numeric_amount_observability/null_amount_reason/annualization_policy/combined_limit_policy/confidence_tier. The agent reasoning surface

**Grain.** One row per Medicare Advantage plan-segment per PBP file snapshot. The minimal verified-unique key is (contract_id, plan_id, segment_id, report_year, quarter) = 201,488 distinct combinations = 201,488 total rows (exact). All five columns are load-bearing: dropping quarter collapses to 114,175; dropping segment_id to 191,793; dropping report_year to 59,740. network_type, renal_dialysis_sub_benefit, and benefit_category are all single-valued ('in_network' / 'renal_dialysis' / 'renal_dialysis') so they are NOT part of the grain. The view is already deduplicated to one PBP submission version per plan-snapshot (version is functionally dependent on the grain, not a dedup axis).

**How to use it.** Benchmark MA dialysis coinsurance for a given year, deduping the quarter fan-out: SELECT coinsurance_pct, COUNT(*) FROM medicare_semantic.vw_pbp_renal_dialysis WHERE report_year=2026 AND quarter=1 AND coinsurance_pct IS NOT NULL GROUP BY coinsurance_pct ORDER BY 2 DESC; -- answers 'what coinsurance % do MA plans charge for renal dialysis in 2026' (you'll see 20% dominate). For trend, group by report_year with quarter=1 (or max quarter per year) to avoid 4x-counting plans in multi-quarter years. Join to plan-level enrollment via (contract_id, plan_id, segment_id, report_year).

**Traps.**
- QUARTER FAN-OUT is the #1 trap: report_year is the real time axis, but for 2018-2020 and 2022-2024 CMS ships multiple quarterly snapshots, so the SAME plan-year appears up to 4x (one row per quarter, each with a distinct sha256_content_hash). Most years are Q1-only. To get one row per plan per year you MUST filter to a single quarter (e.g. quarter=1) or pick max(quarter) - otherwise you 4x-count plans in those years.
- DOLLAR AMOUNTS DO NOT EXIST HERE: copay_amount, benefit_amount (and its whole _kind/_annualized/_pmpm/_period family), limit_quantity/limit_text/limit_unit/limit_period_code, max_oop_applies, and normalization_status/basis/aggregation_policy are ALL 100% NULL. The only populated cost lever is coinsurance_pct (and its min/max/string). This is by design (numeric_amount_observability='offered_without_numeric_amounts') - PBP B12 records dialysis cost-share as a coinsurance %, the standard being 20% (73% of rows).
- MANY COLUMNS ARE SINGLE-VALUED (degenerate), so they look meaningful but never filter anything: benefit_category, renal_dialysis_sub_benefit, network_type ('in_network'), offered_status ('offered'), source_pbp_section ('B12'), source_silver_table, lmi_authorities, confidence_tier ('source_faithful'), numeric_amount_observability, null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status. network_type='in_network' for ALL rows means out-of-network dialysis cost-share is NOT in this view.
- NULLS ENCODE DATA VINTAGE, not 'no/zero': auth_required is NULL for every year before 2018 (legacy PBP layouts didn't capture it - it is not 'no auth required'). Numeric coinsurance_pct only begins ~2009. segment_id is empty-string '' (not '0') in 2001-2005, the pre-segmentation era - normalize ''->'0'/null before joining.
- has_* booleans are INDEPENDENT of the numeric columns and can contradict them: has_copay=TRUE in ~14,458 rows while copay_amount is always null; has_coinsurance=TRUE while coinsurance_pct is null in 5,212+ rows. Trust the flag for presence, but never infer a dollar amount from it. Use coinsurance_pct_min<>coinsurance_pct_max (7,034 rows) to detect coinsurance RANGES rather than point values.
- version is NOT a dedup key you need to apply: the grain (contract_id, plan_id, segment_id, report_year, quarter) is already unique, so the view has pre-selected one PBP submission version per plan-snapshot. Likewise sha256_content_hash and source_url are per-file-snapshot (40 distinct), not per-row identifiers - do not GROUP BY them expecting row uniqueness.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage contract ID (e.g. 'H0028'). Prefix encodes type: H = local MA/MA-PD (1,933 contracts, 197,609 rows), R = regional PPO (37 contracts), E = employer/EGWP (2 contracts). Grain key part 1. 1,972 distinct. |
| plan_id | string | Plan ID within the contract (3-char, e.g. '001','014'). Identifies a specific benefit package under the contract. Grain key part 2. NOT unique on its own (656 distinct, reused across contracts). |
| segment_id | string | Plan segment ID (geographic/benefit segment). '0' for non-segmented plans (181,424 rows). Empty string '' (5,074 rows) is the LEGACY non-segmented representation used only in 2001-2005 - treat as null/0 for joins. Values '1'-'27' for segmented plans. Grain key part 3. |
| version | double | PBP file resubmission version within the year (plans refile multiple times). 0 for 2001-2006 (single-version era); 1-27 for 2007+. FUNCTIONALLY DEPENDENT on the grain - the view already keeps one version per plan-snapshot, so it is NOT needed to make rows unique and should not be treated as a key. |
| report_year | double | Benefit/contract year the PBP applies to (2001-2026). THIS IS THE REAL TIME AXIS for trend analysis, not 'quarter'. Stored as double. |
| quarter | double | Within-year CMS file-release snapshot (1-4). Most years have only Q1; but 2018-2020 and 2022-2024 ship multiple quarterly releases, so the SAME plan-year can appear up to 4x (one row per quarterly snapshot, each with its own sha256). This is the #1 fan-out trap. Stored as double. |
| benefit_category | string | Constant 'renal_dialysis' for every row (degenerate). Identifies the PBP service category. |
| cost_share_string | string | Human-readable cost-share render, e.g. '20.0%'. EMPIRICALLY ALWAYS a coinsurance percent string - never contains a dollar copay or 'copay' text (0 dollar-like values observed). Pure restatement of coinsurance_pct. Null in 46,445 rows. 155,043 filled. |
| copay_amount | double | ALWAYS NULL (0 of 201,488 filled). Renal dialysis in PBP B12 is recorded as coinsurance, never a flat-dollar copay. Scaffolding column shared with sibling PBP views. |
| coinsurance_pct | double | Enrollee coinsurance percent for dialysis - the ONLY populated numeric cost lever. 20% dominates (146,858 rows = 73%, the standard Medicare Part B dialysis coinsurance); 0% (6,612); other values 2-100% (1,573). Null in 46,445 rows (older vintages + not-extracted). Numeric coverage starts ~2009. 155,043 filled. |
| limit_text | string | ALWAYS NULL (0 filled). Benefit-limit free text - never populated for renal dialysis. |
| auth_required | boolean | Boolean: prior authorization required for the benefit. NULL FOR ALL YEARS BEFORE 2018 (field not parsed in legacy PBP layouts) - null means 'not recorded in that vintage', not 'no auth'. 139,729 non-null (all 2018+). |
| referral_required | boolean | Boolean: referral required. Populated from 2002 onward (null only in 2001 and a few stragglers). 188,899 non-null. Null in early-2001 vintage means not-recorded. |
| network_type | varchar(10) | Constant 'in_network' for every row (degenerate). This view only carries the in-network cost-share leg; out-of-network is not represented here. |
| max_oop_applies | boolean | ALWAYS NULL (0 filled). Whether the benefit counts toward the plan MOOP - not populated for this benefit. |
| limit_quantity | double | ALWAYS NULL (0 filled). Numeric benefit limit - not populated. |
| limit_unit | string | ALWAYS NULL (0 filled). Unit for limit_quantity - not populated. |
| limit_period_code | string | ALWAYS NULL (0 filled). Period code for the limit - not populated. |
| limit_period_label | string | Always null (paired with limit_period_code). Human label for limit period - not populated. |
| limit_quantity_per_year | double | ALWAYS NULL (0 filled). Annualized limit quantity - not populated. |
| benefit_amount | double | ALWAYS NULL (0 filled). Plan-paid/benefit dollar amount - the entire benefit_amount_* family is empty for renal dialysis (this benefit is cost-share-only, not a dollar allowance like OTC/dental). |
| benefit_amount_kind | string | ALWAYS NULL (0 filled). Kind/type of benefit amount - not populated. |
| benefit_amount_period_code | string | Always null. Period code for benefit amount - not populated. |
| benefit_amount_period_label | string | Always null. Human label for benefit-amount period - not populated. |
| benefit_amount_annualized | double | ALWAYS NULL (0 filled). Annualized benefit dollars - not populated. |
| benefit_amount_pmpm | double | ALWAYS NULL (0 filled). Per-member-per-month benefit dollars - not populated. |
| normalization_status | string | ALWAYS NULL (0 filled). Status of the dollar-amount normalization pipeline - this benefit has no dollar amounts to normalize. |
| normalization_basis | string | ALWAYS NULL (0 filled). Basis used for normalization - not populated. |
| aggregation_policy | string | ALWAYS NULL (0 filled). Aggregation policy for combined limits - not populated. |
| offered_status | varchar(15) | Constant 'offered' for every row (degenerate). Every row represents a plan that offers the renal-dialysis benefit (Medicare requires MA plans to cover dialysis). |
| numeric_amount_observability | varchar(31) | Constant 'offered_without_numeric_amounts' for every row. Declares the central caveat of this view: the benefit is offered but PBP B12 carries no dollar amounts (only coinsurance %). |
| null_amount_reason | varchar(30) | Constant 'unknown_requires_crosswalk' for every row. Explains why dollar amounts are null - resolving them would require an external crosswalk. |
| annualization_policy | varchar(17) | Constant 'not_numeric' for every row. No numeric amount exists to annualize. |
| combined_limit_policy | varchar(29) | Constant 'none_detected' for every row. No combined/shared benefit limit detected. |
| consumer_document_reconciliation_status | varchar(11) | Constant 'not_checked' for every row. These records have not been reconciled against consumer-facing documents (EOC/SB). |
| confidence_tier | varchar(23) | Constant 'source_faithful' for every row. Indicates values are a faithful transcription of the CMS PBP source (no inference applied). |
| coinsurance_pct_max | double | Upper bound of the coinsurance band. 152,283 filled. Equals coinsurance_pct_min for point values (145,249 rows); differs in 7,034 rows where the plan files a coinsurance RANGE. |
| coinsurance_pct_min | double | Lower bound of the coinsurance band. 155,043 filled. Use (min,max) together to detect ranges; equals the point value when min=max. |
| copay_amount_max | double |  |
| copay_amount_min | double |  |
| has_coinsurance | boolean | Boolean parsed from the PBP yes/no flag, INDEPENDENT of the numeric column. Can be TRUE while coinsurance_pct is NULL (5,212+ rows: flag set but % not extracted). 191,289 non-null. Null only in 2001 vintage. |
| has_copay | boolean | Boolean copay flag from PBP. NOTE: has_copay=TRUE in ~14,458 rows even though copay_amount is ALWAYS null - the flag is preserved from source but the dollar value was never captured. Do not infer a copay dollar from this flag. |
| has_deductible | boolean | Boolean: a deductible applies to the benefit (from PBP flags). Almost always false; a handful of true rows. No deductible dollar column is populated. |
| has_max_enrollee_oop | boolean | Boolean: a max enrollee OOP applies (from PBP flags). Almost always false. Independent of the (always-null) max_oop_applies column. |
| renal_dialysis_sub_benefit | string | Constant 'renal_dialysis' for every row (degenerate). Placeholder for sub-benefit breakout that PBP B12 does not split for this view. |
| source_pbp_section | varchar(3) | Constant 'B12' for every row. The CMS PBP section this benefit is parsed from (Section B12 = Renal Dialysis). |
| source_silver_table | varchar(46) | Constant 'medicare_silver.pbp_section_b12_renal_dialysis'. The upstream silver-tier table this gold view is built from. |
| lmi_authorities | string | Constant single LMI URL (CY2026 PBP Service Category Descriptions PDF). The authoritative benefit-definition reference; same for all rows. |
| source_url | string | CMS PBP source zip for that snapshot - varies by (report_year, quarter). 40 distinct URLs. Legacy years use the mcradvpartdenroldata path; 2018+ use cms.gov/files/zip/pbp-benefits-YYYY[-quarter-N].zip. One file per snapshot. |
| sha256_content_hash | string | Content hash of the source PBP file snapshot (40 distinct = one per file release). It is PER-SNAPSHOT-FILE, not per-row: the same plan in different quarters of one year has DIFFERENT hashes (each quarterly release is a distinct file). Provenance/dedup anchor, not a row key. |

Tools that read it: get_pbp_benefit

Query it: `query_substrate` with `SELECT ... FROM medicare_semantic.vw_pbp_renal_dialysis WHERE ... LIMIT 100`; read `describe_data_source("medicare_semantic.vw_pbp_renal_dialysis")` first.
