Medicare Advantage, Part D, Medicaid
PBP renal dialysis (cleaned view)
medicare_semantic.vw_pbp_renal_dialysis·live·semantic_view·annualRows
N/A
Columns
50
History
2001 to 2026
Card
yesgrain, traps, filters
Typed tools
1
What it is
- 1A semantic gold view of the Medicare Advantage PBP (Plan Benefit Package) Section B12 "Renal Dialysis" benefit: one normalized cost-sharing record per MA/MA-PD plan-segment per annual (and in some years quarterly) CMS PBP file release, 2001-2026.
- 2It captures what enrollees pay out-of-pocket for kidney dialysis under each Medicare Advantage plan, plus auth/referral rules and rich provenance/confidence metadata.
- 3Used to benchmark MA dialysis cost-sharing across plans and over time.
Grain
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarter |
|
How to read it
- 1Benchmark 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).
- 2For trend, group by report_year with quarter=1 (or max quarter per year) to avoid 4x-counting plans in multi-quarter years.
- 3Join to plan-level enrollment via (contract_id, plan_id, segment_id, report_year).
Traps
- 1QUARTER 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.
- 2DOLLAR 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).
- 3MANY 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.
- 4NULLS 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.
- 5has_* 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.
- 6version 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.
Columns (50)
| 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. |
Query it
describe_data_source(source_fqn="medicare_semantic.vw_pbp_renal_dialysis") # the card, live query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_renal_dialysis WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' LIMIT 100")
| Item | Value |
|---|---|
| Typed tools that read it | get_pbp_benefit |
| Identity key | contract_id,plan_id,segment_id |
| Join | how_to_join(source_fqn="medicare_semantic.vw_pbp_renal_dialysis") |
| Raw door | Athena (read-only via query_substrate): medicare_semantic.vw_pbp_renal_dialysis |
| Note | Cleaned PBP reasoning surface (categories/renal_dialysis/contract.yaml); raw is pbp_section_*. |
This page as markdown: /docs-md/data/medicare_semantic_vw_pbp_renal_dialysis.md · every page in one file: /llms-full.txt