Medicare Advantage, Part D, Medicaid

MA pbp mrx p

medicare_silver.pbp_mrx_p·partial·silver·annual·Part D Plans & Formularies
Rows
N/A
Columns
40
History
2010 (report_year 2010 / effective_period_start 2010-01-01) to 2026 (report_year 2026 / effective_period_start 2026-01-01)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A CMS Medicare Advantage / Part D Plan Benefit Package (PBP) extract that records, for every Part D drug plan and benefit year, the plan's "post-deductible / initial-coverage" prescription-drug cost-sharing tier structure — one row per formulary tier (Preferred Generic, Generic, Preferred Brand, Non-Preferred, Specialty, etc.) with that tier's flat copay or coinsurance.
  2. 2It is the high-level tier summary; the granular per-pharmacy-channel cost-sharing (preferred vs standard retail, mail, 1/2/3-month supply, LTC, out-of-network) lives in the sibling table pbp_mrx_tier.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquartermrx_tier_post_id
  1. 1One row per Part D plan segment per formulary drug tier per quarterly CMS snapshot.
  2. 2Verified minimal key = contract_id + plan_id + segment_id + report_year + quarter + mrx_tier_post_id (each column is required; dropping any makes it non-unique).
  3. 3622,445 rows total;
  4. 4290,631 within a single quarter (quarter=1).
  5. 5The "p" in the table name = the POST (post-deductible / initial coverage) phase of the Part D benefit.

How to read it

  1. 1To compare a plan's published drug-tier cost structure for a benefit year, filter to one snapshot and inspect the tiers.
  2. 2Example: SELECT mrx_tier_post_id, mrx_tier_post_label_list, mrx_tier_post_cost_struct, mrx_tier_post_copay_amt, mrx_tier_post_coins_pct FROM medicare_silver.pbp_mrx_p WHERE contract_id='H0028' AND plan_id='014' AND segment_id='0' AND report_year=2026 AND quarter=1 ORDER BY CAST(mrx_tier_post_id AS int); — returns that plan's 2026 formulary tiers (Preferred Generic → Specialty) and their post-deductible cost-sharing structure.
  3. 3For the actual retail/mail copays by day-supply, join the same plan key to medicare_silver.pbp_mrx_tier.

Traps

  1. 1COST IS MOSTLY NULL HERE. Only ~23.6% of the standard 5-tier rows carry any copay or coinsurance (148K/622K have a copay, 8K have coinsurance, 472K rows have neither). This 'post' table is the tier SUMMARY; the real per-pharmacy-channel cost-sharing (preferred vs standard retail, mail order, 1/2/3-month supply, LTC, OON) is in the SIBLING table medicare_silver.pbp_mrx_tier (columns mrx_tier_inp_copay_1m, mrx_tier_innpp_*, mrx_tier_oon_*, etc.). For actual drug copays, join to pbp_mrx_tier, not this table alone.
  2. 2NO is_current flag and quarter is the snapshot dimension. CMS republishes the entire PBP file each quarter, so one plan-year appears up to 4 times (Q1–Q4) as near-duplicate rows. The grain REQUIRES quarter. To get one row per plan-year, filter to a single quarter (quarter=1, or MAX(quarter)). Counting rows without this double/triple/quadruple-counts plans in 2018–2024.
  3. 3Decode copay vs coinsurance via mrx_tier_post_cost_struct: NULL=cost not stored here (look in pbp_mrx_tier), '2'=copay only, '1'=coinsurance only, '3'=both. Don't assume a NULL copay means $0 — it usually means 'detail lives elsewhere'.
  4. 4Dead / near-dead columns: mrx_tier_post_type_id is the constant '2' (the profiler wrongly put it in the grain — it adds nothing); mrx_tier_post_ref_prcng_yn and mrx_tier_post_lbl are 100% NULL; spec_yn/inject_yn/cst_shr_type/includes_mmp are >98% NULL. bid_id is just contract_id_plan_id_segment_id concatenated. plan_type/effective_period_start/observed_period in the profiler's 10-col key are redundant — the true minimal grain is 6 columns.
  5. 5plan_id and segment_id are zero-padded STRINGS ('001','0'), not integers — cast carefully when joining. report_year/quarter/version are stored as doubles (2023.0, 1.0). orgtype='10' rows are standalone PDPs and legitimately have NULL pbp_a_ben_cov.
  6. 6asserted_at / parse_revision / cms_vintage_sequence / parser_artifact_hash / sha256_content_hash are Vlada ingestion provenance, NOT plan attributes. asserted_at (2026-05-16/20) is the load date — never use it as a plan effective date; use report_year / effective_period_start for that.

Columns (40)

ColumnTypeMeaning
contract_idstringCMS Medicare contract ID (e.g. H0022, H0028); 1,275 distinct. Part of the plan identity. H-contracts=MA/MA-PD, S-contracts=PDP.
plan_idstring3-digit plan number within the contract, zero-padded string (e.g. '001','014'); 546 distinct. NOT unique on its own.
segment_idstringPlan segment ('0' for non-segmented; up to 24 distinct). Distinguishes geographic/benefit segments of the same plan. Required for the grain.
mrx_tier_post_label_liststringHuman label of THIS tier as named by the plan (e.g. 'Preferred Brand','Specialty Tier','Preferred Generic','Generic','Non-Preferred Drug','Vaccines','Select Care Drugs'). The descriptive name for the tier whose number is mrx_tier_post_id.
versiondoublePBP bid submission version for this plan (1.0–26.0). Constant across all tier rows of a given plan-year-quarter (verified: no plan-year-quarter has >1 version). Higher = later resubmission of that plan's bid.
report_yeardoublePlan/benefit year the cost-sharing applies to (2010–2026). Equals the year of effective_period_start. The main time dimension.
quarterdoubleCMS quarterly release (1–4) the row was sourced from. CMS republishes the full PBP file each quarter, so one plan-year can appear up to 4 times. THIS is the snapshot/dedup dimension — there is NO is_current flag. Pick quarter=1 (or MAX) for one row per plan-year.
bid_idstringConcatenation contract_id_plan_id_segment_id (e.g. 'H0022_001_0'). Fully redundant with the first three columns; convenience key only.
mrx_tier_post_benefit_typestringPart-D benefit-design code for the tier: '4' (defined standard / actuarially-equivalent, 88% of rows), '3', '2'. Indicates the standard-vs-enhanced benefit context, not the dollar amount.
mrx_tier_post_coins_pctdoubleCoinsurance percentage the member pays for this tier in the post-deductible phase (0–50%, avg ~5.4 when set). NULL on 98.6% of rows. Set only when cost_struct IN (1,3). Mutually-exclusive-ish with copay_amt.
mrx_tier_post_copay_amtdoubleFlat dollar copay the member pays for this tier (post-deductible) ($0–$100, avg ~$1.40 over all rows). NULL on 76% of rows. Populated only when cost_struct IN (2,3).
mrx_tier_post_copay_amt_mmpmaxdoubleUpper-bound copay for Medicare-Medicaid Plans (MMP/D-SNP integrated) members. Non-null for only 3,623 rows / 72 contracts (range 0–3.4). NULL = not an MMP-specific row.
mrx_tier_post_copay_amt_mmpmindoubleLower-bound MMP copay (companion to mmpmax). Same 3,623-row MMP-only population. NULL = not MMP-specific.
mrx_tier_post_cost_structstringCost-sharing structure flag that decodes which cost column is populated: NULL=neither populated here (76% — detail is in pbp_mrx_tier), '2'=copay only, '1'=coinsurance only, '3'=both copay AND coinsurance. The key to interpreting copay vs coins.
mrx_tier_post_cst_shr_typestringCost-share type sub-code; almost entirely NULL (616,230 rows), '2'=5,737, '1'=478. Low-value / rarely populated.
mrx_tier_post_drug_typestringBitmask-style code of drug categories the tier covers ('11'=most common, '01','10', plus 6-digit masks like '010010'). Encodes generic/brand/specialty mix; pairs with form_model_desc.
mrx_tier_post_form_model_descstringFull ordered tier-model string for the WHOLE plan (e.g. 'Preferred Generic, Generic, Preferred Brand, Non-Preferred Drug, Specialty Tier'). Same value repeated on every tier row of that plan; describes the overall formulary tier layout.
mrx_tier_post_idstringTier NUMBER 1–7 (1=lowest/preferred-generic … 5=specialty; 6–7 rare extra tiers). Part of the grain — identifies which tier the row's cost-sharing is for. mrx_tier_post_label_list is its name.
mrx_tier_post_includesstringCode for what the tier 'includes' relative to other tiers: '1' (89%), '3','2', NULL. Cross-references tiers (e.g. specialty tier includes injectables). Mostly '1'.
mrx_tier_post_includes_mmpstringMMP-specific 'includes' code; NULL on 99.4% of rows (only the 3,623 MMP rows populate '1'/'2'/'3').
mrx_tier_post_inject_ynstringWhether the tier is for injectable drugs ('1'/'2'); 99.8% NULL. Sparse flag.
mrx_tier_post_lblstringFree-text tier label override; 100% NULL in this extract — effectively a dead column.
mrx_tier_post_ref_prcng_ynstringReference-pricing yes/no flag; 100% NULL across all 622,445 rows — DEAD column, never populated.
mrx_tier_post_spec_ynstringWhether the tier is a specialty tier ('1'/'2'); 99.8% NULL. Specialty tiers are usually identified via the label instead.
mrx_tier_post_type_idstringCONSTANT '2' on all 622,445 rows — a dead key. The profiler put it in the grain but it carries no information.
orgtypestringCMS organization type: '01'=local CCP/MA-PD (79%), '10'=standalone PDP (113K rows, these have NULL pbp_a_ben_cov), plus '04','05','06','11'. Identifies MA vs standalone-PDP context.
part_d_enhncd_cvrg_demostringEnhanced-coverage demonstration flag ('Y'/'N'); NULL on 76% of rows (older years). Indicates participation in the Part D enhanced-coverage demo.
part_d_model_demostringPart D model/demonstration participation ('Y'/'N'); 97% NULL, 'Y' only 122 rows. Niche demo marker (e.g. VBID/Senior Savings).
pbp_a_ben_covstringBenefit-coverage indicator from PBP section A: '1'=508K, NULL=113K (all the orgtype=10 standalone-PDP rows), '2'=547. Distinguishes MA-PD vs PDP benefit-coverage context.
pbp_a_plan_typestringMA/PDP plan-type code: '01'=HMO (283K), '04'=Local PPO (150K), '29'=PDP standalone (113K), '02'=HMO-POS, '31'=Regional PPO, '48','18','09'… Identifies the product type. Part of the profiler's superset key but redundant given contract/plan/segment+year+quarter.
observed_perioddateDate the data represents = Jan 1 of report_year (always equals effective_period_start in this table). Vlada bitemporal column.
asserted_atdateDate Vlada loaded/asserted the row (two batches: 2026-05-16 and 2026-05-20). Pure ingestion provenance — NOT plan data; do not use as plan effective date.
effective_period_startdateStart of the plan year = Jan 1 of report_year (2010-01-01 … 2026-01-01). The profiler's temporal anchor; interchangeable with report_year.
effective_period_enddateEnd of the plan year = Dec 31 of report_year. Always the full calendar year.
cms_vintage_sequenceintCMS file-vintage sequence (1–4). Roughly tracks quarter for re-released years (2→Q2, 3→Q3, 4→Q4) but for Q1 it is mostly 1 with exceptions (2022→2, 2024→4). Provenance/dedup helper; do NOT treat as identical to quarter.
parse_revisionintVlada parser revision that produced the row ('1' for the 2026-05-16 batch, '2' for 2026-05-20). Ingestion provenance only.
parser_artifact_hashstringSHA-256 of the parser artifact/code version. Provenance for reproducibility.
source_urlstringCMS source ZIP the row came from, e.g. https://www.cms.gov/files/zip/pbp-benefits-2023-quarter-1.zip. Encodes year+quarter of the release.
sha256_content_hashstringSHA-256 of the underlying source content file. Provenance/integrity hash.
source_row_ordinaldouble

Query it

describe_data_source(source_fqn="medicare_silver.pbp_mrx_p")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.pbp_mrx_p WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND mrx_tier_post_id = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id,plan_id,segment_id,version,mrx_tier_post_id,mrx_tier_post_type_id,report_year,quarter
Joinhow_to_join(source_fqn="medicare_silver.pbp_mrx_p")
Raw doorAthena (read-only via query_substrate): medicare_silver.pbp_mrx_p
NoteGrain-governed; live in Glue / query_substrate. Source family pbp_benefits.

This page as markdown: /docs-md/data/medicare_silver_pbp_mrx_p.md · every page in one file: /llms-full.txt