Medicare Advantage, Part D, Medicaid

PBP renal dialysis (cleaned view)

medicare_semantic.vw_pbp_renal_dialysis·live·semantic_view·annual
Rows
N/A
Columns
50
History
2001 to 2026
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 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.
  2. 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.
  3. 3Used to benchmark MA dialysis cost-sharing across plans and over time.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per Medicare Advantage plan-segment per PBP file snapshot.
  2. 2The minimal verified-unique key is (contract_id, plan_id, segment_id, report_year, quarter) = 201,488 distinct combinations = 201,488 total rows (exact).
  3. 3All 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.
  4. 4The 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 read it

  1. 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).
  2. 2For trend, group by report_year with quarter=1 (or max quarter per year) to avoid 4x-counting plans in multi-quarter years.
  3. 3Join to plan-level enrollment via (contract_id, plan_id, segment_id, report_year).

Traps

  1. 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.
  2. 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).
  3. 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.
  4. 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.
  5. 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.
  6. 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)

ColumnTypeMeaning
contract_idstringCMS 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_idstringPlan 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_idstringPlan 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.
versiondoublePBP 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_yeardoubleBenefit/contract year the PBP applies to (2001-2026). THIS IS THE REAL TIME AXIS for trend analysis, not 'quarter'. Stored as double.
quarterdoubleWithin-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_categorystringConstant 'renal_dialysis' for every row (degenerate). Identifies the PBP service category.
cost_share_stringstringHuman-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_amountdoubleALWAYS 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_pctdoubleEnrollee 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_textstringALWAYS NULL (0 filled). Benefit-limit free text - never populated for renal dialysis.
auth_requiredbooleanBoolean: 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_requiredbooleanBoolean: 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_typevarchar(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_appliesbooleanALWAYS NULL (0 filled). Whether the benefit counts toward the plan MOOP - not populated for this benefit.
limit_quantitydoubleALWAYS NULL (0 filled). Numeric benefit limit - not populated.
limit_unitstringALWAYS NULL (0 filled). Unit for limit_quantity - not populated.
limit_period_codestringALWAYS NULL (0 filled). Period code for the limit - not populated.
limit_period_labelstringAlways null (paired with limit_period_code). Human label for limit period - not populated.
limit_quantity_per_yeardoubleALWAYS NULL (0 filled). Annualized limit quantity - not populated.
benefit_amountdoubleALWAYS 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_kindstringALWAYS NULL (0 filled). Kind/type of benefit amount - not populated.
benefit_amount_period_codestringAlways null. Period code for benefit amount - not populated.
benefit_amount_period_labelstringAlways null. Human label for benefit-amount period - not populated.
benefit_amount_annualizeddoubleALWAYS NULL (0 filled). Annualized benefit dollars - not populated.
benefit_amount_pmpmdoubleALWAYS NULL (0 filled). Per-member-per-month benefit dollars - not populated.
normalization_statusstringALWAYS NULL (0 filled). Status of the dollar-amount normalization pipeline - this benefit has no dollar amounts to normalize.
normalization_basisstringALWAYS NULL (0 filled). Basis used for normalization - not populated.
aggregation_policystringALWAYS NULL (0 filled). Aggregation policy for combined limits - not populated.
offered_statusvarchar(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_observabilityvarchar(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_reasonvarchar(30)Constant 'unknown_requires_crosswalk' for every row. Explains why dollar amounts are null - resolving them would require an external crosswalk.
annualization_policyvarchar(17)Constant 'not_numeric' for every row. No numeric amount exists to annualize.
combined_limit_policyvarchar(29)Constant 'none_detected' for every row. No combined/shared benefit limit detected.
consumer_document_reconciliation_statusvarchar(11)Constant 'not_checked' for every row. These records have not been reconciled against consumer-facing documents (EOC/SB).
confidence_tiervarchar(23)Constant 'source_faithful' for every row. Indicates values are a faithful transcription of the CMS PBP source (no inference applied).
coinsurance_pct_maxdoubleUpper 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_mindoubleLower bound of the coinsurance band. 155,043 filled. Use (min,max) together to detect ranges; equals the point value when min=max.
copay_amount_maxdouble
copay_amount_mindouble
has_coinsurancebooleanBoolean 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_copaybooleanBoolean 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_deductiblebooleanBoolean: 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_oopbooleanBoolean: a max enrollee OOP applies (from PBP flags). Almost always false. Independent of the (always-null) max_oop_applies column.
renal_dialysis_sub_benefitstringConstant 'renal_dialysis' for every row (degenerate). Placeholder for sub-benefit breakout that PBP B12 does not split for this view.
source_pbp_sectionvarchar(3)Constant 'B12' for every row. The CMS PBP section this benefit is parsed from (Section B12 = Renal Dialysis).
source_silver_tablevarchar(46)Constant 'medicare_silver.pbp_section_b12_renal_dialysis'. The upstream silver-tier table this gold view is built from.
lmi_authoritiesstringConstant single LMI URL (CY2026 PBP Service Category Descriptions PDF). The authoritative benefit-definition reference; same for all rows.
source_urlstringCMS 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_hashstringContent 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")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id,plan_id,segment_id
Joinhow_to_join(source_fqn="medicare_semantic.vw_pbp_renal_dialysis")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_renal_dialysis
NoteCleaned 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