Medicare Advantage, Part D, Medicaid

PBP partd tier (cleaned view)

medicare_semantic.vw_pbp_partd_tier·partial·semantic_view·quarterly
Rows
N/A
Columns
178
History
2010 (report_year 2010, Q1) to 2026 (report_year 2026, Q1)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A semantic view over CMS Medicare Advantage Part D Plan Benefit Package (PBP) data that flattens each Part D plan's prescription-drug formulary TIER structure (Preferred Generic, Generic, Preferred Brand, Non-Preferred, Specialty, etc.) and the member cost-share (copay/coinsurance) charged at each tier across pharmacy channels.
  2. 2It is the drug-benefit cost-design layer of the PBP, used to compare what beneficiaries pay out-of-pocket by drug tier across plans, regions, channels, and years.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquartertier_idtier_type_id
  1. 1One row per formulary tier position, per plan-segment, per quarterly PBP snapshot.
  2. 2The MINIMAL verified-unique key is contract_id + plan_id + segment_id + report_year + quarter + tier_id + tier_type_id.
  3. 3That 7-column combination yields exactly 792,027 distinct values = 792,027 total rows (verified).
  4. 4Dropping tier_type_id collapses to 675,843 (a plan can carry two parallel tier structures, type 1 and type 3, in the same snapshot — 57,422 plan-periods do), so tier_type_id is genuinely required. version is NOT part of the key: max distinct versions per grain key = 1 across all 792,027 keys, so it is functionally determined provenance, not a grain column.

How to read it

  1. 1Compare what beneficiaries pay by drug tier across plans for the current year.
  2. 2Example: SELECT contract_id, plan_id, tier_id, tier_label_list, retail_standard_copay_1m, ira_retail_standard_copay_1m, mail_order_standard_copay_3m FROM medicare_semantic.vw_pbp_partd_tier WHERE report_year=2026 AND quarter=1 AND tier_type_id='1' ORDER BY contract_id, plan_id, CAST(tier_id AS integer).
  3. 3This returns each plan's formulary ladder (Preferred Generic -> Specialty) with the 30-day retail copay (both the standard and the IRA-standard-benefit figure) and the 90-day mail-order copay, answering 'how much does a member pay for a generic vs a specialty drug under this plan, at retail vs mail order, this year'.
  4. 4Always filter to one quarter per year (quarters are duplicate snapshots) and read cost-share from the retail_/mail_/oon_/ltc_/ira_ columns, never from the always-null generic copay/coinsurance fields.

Traps

  1. 1GRAIN TRAP: tier_id alone is NOT unique within a plan-snapshot. tier_type_id is a required part of the key (1=standard scenario, 3=second scenario; 57,422 plan-periods carry BOTH). The true minimal key is the 7 columns contract_id+plan_id+segment_id+report_year+quarter+tier_id+tier_type_id (=792,027 rows exactly). version is NOT in the key (1 version per key, functionally determined). The profiler's reported key wrongly included the all-NULL limit_period_code / benefit_amount_period_code / confidence_tier columns — those are constants, not key columns.
  2. 2QUARTER IS A SNAPSHOT/VINTAGE AXIS, NOT cost variation: the same plan-year tier reappears with IDENTICAL cost-share in each quarterly PUF re-release (verified). To get one row per plan-year tier, pick the latest quarter per report_year (there is no is_current flag — dedup by MAX(quarter) within report_year, or by MAX(version)). Pre-2018 and 2021 only have quarter=1.
  3. 3MOST GENERIC BENEFIT COLUMNS ARE DEAD HERE: benefit_amount, benefit_amount_pmpm, coinsurance_pct, cost_share_string, limit_*, auth_required, referral_required are ALWAYS NULL, and network_type/offered_status/benefit_category/numeric_amount_observability/null_amount_reason/confidence_tier are CONSTANT (inherited from a shared multi-benefit view schema). The real cost-share lives ONLY in the channel-specific families: retail_*/mail_order_*/oon_*/ltc_* (non-IRA) and ira_* (IRA). The governance flag 'offered_without_numeric_amounts' refers only to the dead generic columns, NOT to absence of cost data.
  4. 4IRA vs NON-IRA COPAY SPLIT: ira_* copay columns are populated ONLY from report_year 2024 onward (0 before) and reflect the IRA-redesigned standard benefit / $2,000 OOP-cap era; they can differ materially from the matching non-IRA column (e.g. Non-Preferred tier non-IRA $99 vs IRA $35). copay_amount mirrors the NON-IRA retail_standard_copay_1m only, so do not use copay_amount as the IRA figure. For 2010-2015 only the coinsurance columns (oon_pharmacy_coins_1m, etc.) carry data — copay columns start ~2016.
  5. 5ALL tier_* CODE COLUMNS ARE RAW CMS PBP ENUMERATIONS (tier_benefit_type, tier_cost_share_structure, tier_drug_type, tier_includes, tier_location_*). They are 'source_faithful' (not decoded). Decode them with the LMI 'PBP Service Category Descriptions' PDF linked in lmi_authorities. tier_label_list is the only human-readable tier name, and it can vary by plan at the same tier_id position. This view is the Part D DRUG-tier slice only (source_pbp_section=MRX_TIER); medical-benefit categories live in sibling vw_pbp_* views.

Columns (178)

ColumnTypeMeaning
contract_idstringCMS Medicare contract ID (e.g. H0022). 1,427 distinct. Identifies the MA/PDP organization contract; combine with plan_id+segment_id for the plan instance.
plan_idstringPlan ID within the contract (e.g. '001'). 3-char string, NOT globally unique (645 distinct values reused across contracts). Only meaningful with contract_id.
segment_idstringPlan benefit segment (regional sub-variant). Mostly '0' (90% of rows = 716,236); '1'-'N' for plans with geographic segments that vary benefits. Part of the plan identity.
versiondoubleCMS PBP file submission version for this snapshot (integer 1-26). Provenance only — functionally determined by the grain key (max 1 version per key). Multiple versions appear within a year because the PBP is resubmitted; each row carries the version of its snapshot. NOT a grain column.
report_yeardoublePBP contract/benefit year (double, 2010-2026). THE primary history dimension. This is the plan year the benefits apply to, not a publish date.
quarterdoubleQuarter of the PBP PUF release that this snapshot came from (1-4). Part of the grain: the same plan-year/tier reappears in each quarterly PUF re-release with identical data (verified: H0028/004/2019 tiers identical across Q1-Q4). Pre-2018 and 2021 carry only Q1 (annual); 2018-2020/2022-2024 carry multiple quarters. NOT calendar-quarter cost variation — it is a snapshot/vintage axis.
benefit_categorystringConstant = 'partd_tier' for every row. A discriminator inherited from a shared multi-benefit view schema; here it always marks Part D drug-tier rows.
cost_share_stringstringAlways NULL in this view. Generic free-text cost-share field from the shared schema, not populated for Part D tiers.
copay_amountdoublePartially populated generic copay mirror (205,321 non-null). Equals retail_standard_copay_1m exactly (the non-IRA 30-day retail standard copay), populated only when that value exists. Convenience field — prefer the canonical retail_*/mail_*/oon_*/ltc_* columns for completeness; does NOT reflect the IRA value.
coinsurance_pctdoubleAlways NULL (0 non-null). Generic coinsurance field from the shared schema; for Part D, channel-specific coinsurance lives in oon_pharmacy_coins_1m / ltc_partner_coins_1m instead.
limit_textstringAlways NULL. Generic benefit-limit free text from the shared schema; unused for Part D tiers.
auth_requiredbooleanAlways NULL. Prior-authorization flag from the shared medical-benefit schema; not applicable/unpopulated at the Part D tier grain.
referral_requiredbooleanAlways NULL. Referral flag from the shared schema; unused for Part D tiers.
network_typevarchar(10)Constant = 'in_network' for all rows. Inherited from the shared schema; Part D pharmacy channel is instead carried by the retail/mail/oon/ltc column families and tier_location_* codes, not this field.
max_oop_appliesbooleanBoolean, observed always true in samples. Whether the tier's cost-share counts toward the plan max-out-of-pocket. Mostly a constant placeholder from the shared schema.
limit_quantitydoubleAlways NULL. Generic quantity-limit numeric from the shared schema; unused for Part D tiers.
limit_unitstringAlways NULL. Generic unit-of-limit from the shared schema; unused here.
limit_period_codestringAlways NULL here (appears in profiler's candidate key only because NULL is constant). Generic limit-period code from the shared schema; unused for Part D tiers — do NOT treat as a key column.
limit_period_labelstringAlways NULL. Human label for limit_period_code; unused for Part D tiers.
limit_quantity_per_yeardoubleAlways NULL. Annualized quantity limit from the shared schema; unused here.
benefit_amountdoubleAlways NULL (0 non-null). Generic benefit-dollar field from the shared schema; Part D tier dollars are the copay columns, not this.
benefit_amount_kindstringAlways NULL. Type tag for benefit_amount; unused for Part D tiers.
benefit_amount_period_codestringAlways NULL (constant, hence in profiler candidate key spuriously). Period code for benefit_amount; unused — not a real key column.
benefit_amount_period_labelstringAlways NULL. Human label for benefit_amount_period_code; unused.
benefit_amount_annualizeddoubleAlways NULL. Annualized benefit dollars; unused for Part D tiers.
benefit_amount_pmpmdoubleAlways NULL (0 non-null). Per-member-per-month benefit amount from the shared schema; unused here.
normalization_statusstringAlways NULL for this view. Would mark whether the shared-schema benefit normalization ran; it does not run for Part D tiers (the data is source-faithful raw codes).
normalization_basisstringAlways NULL. The basis used by benefit normalization; not applicable here.
aggregation_policystringAlways NULL. How multiple source rows were aggregated; not applicable at this grain.
offered_statusvarchar(15)Constant = 'offered'. Every row represents an offered Part D tier; the view does not carry not-offered rows.
numeric_amount_observabilityvarchar(31)Constant = 'offered_without_numeric_amounts'. A governance flag stating the GENERIC copay/coinsurance/benefit_amount columns lack numeric values; it does NOT mean cost-share is absent — the numbers live in the channel-specific retail/mail/oon/ltc/ira copay columns.
null_amount_reasonvarchar(30)Constant = 'unknown_requires_crosswalk'. Explains why the generic amount columns are null (the PBP encodes tier cost-share in channel-specific fields that require the LMI crosswalk to interpret).
annualization_policyvarchar(17)Constant = 'not_numeric'. Governance flag; no annualization performed because the generic numeric fields are empty.
combined_limit_policyvarchar(29)Constant = 'none_detected' in samples. Governance flag for combined in/out-of-network limit handling; not engaged for Part D tiers.
consumer_document_reconciliation_statusvarchar(11)Constant = 'not_checked'. Whether the tier was reconciled against a consumer-facing document (e.g. SB/EOC); not done for this view.
confidence_tiervarchar(23)Constant = 'source_faithful'. Data-confidence label: values are the raw CMS PBP codes/amounts as filed, not modeled or imputed.
balance_ltc_pharmacy_copay_1mdouble
balance_ltc_pharmacy_copay_dailydouble
balance_mail_order_preferred_copay_1mdouble
balance_mail_order_preferred_copay_2mdouble
balance_mail_order_preferred_copay_3mdouble
balance_mail_order_preferred_copay_dailydouble
balance_mail_order_standard_copay_1mdouble
balance_mail_order_standard_copay_2mdouble
balance_mail_order_standard_copay_3mdouble
balance_mail_order_standard_copay_dailydouble
balance_model_statusstring
balance_oon_pharmacy_copay_1mdouble
balance_retail_preferred_copay_1mdouble
balance_retail_preferred_copay_2mdouble
balance_retail_preferred_copay_3mdouble
balance_retail_preferred_copay_dailydouble
balance_retail_standard_copay_1mdouble
balance_retail_standard_copay_2mdouble
balance_retail_standard_copay_3mdouble
balance_retail_standard_copay_dailydouble
extended_day_supply_all_drugsboolean
extended_supply_first_fill_limitedboolean
insulin_cost_share_sourcestring
ira_columns_scopevarchar(33)
ira_insulin_cost_share_formstring
ira_insulin_cost_share_stringstring
ira_ltc_partner_copay_1mdouble30-day long-term-care pharmacy copay under the IRA standard benefit. 2024+ only.
ira_mail_order_preferred_coins_1mdouble
ira_mail_order_preferred_coins_2mdouble
ira_mail_order_preferred_coins_3mdouble
ira_mail_order_preferred_copay_1mdouble
ira_mail_order_preferred_copay_2mdouble
ira_mail_order_preferred_copay_3mdouble
ira_mail_order_standard_coins_1mdouble
ira_mail_order_standard_coins_2mdouble
ira_mail_order_standard_coins_3mdouble
ira_mail_order_standard_copay_1mdouble30-day mail-order standard copay under the IRA standard benefit. 2024+ only.
ira_mail_order_standard_copay_2mdouble
ira_mail_order_standard_copay_3mdouble90-day mail-order standard copay under the IRA standard benefit. 2024+ only.
ira_oon_pharmacy_copay_1mdouble30-day out-of-network pharmacy copay under the IRA standard benefit. 2024+ only.
ira_retail_preferred_coins_1mdouble
ira_retail_preferred_coins_2mdouble
ira_retail_preferred_coins_3mdouble
ira_retail_preferred_copay_1mdouble
ira_retail_preferred_copay_2mdouble
ira_retail_preferred_copay_3mdouble
ira_retail_standard_coins_1mdouble
ira_retail_standard_coins_2mdouble
ira_retail_standard_coins_3mdouble
ira_retail_standard_copay_1mdouble30-day retail standard-pharmacy copay under the IRA-redesigned standard benefit. Populated only from report_year 2024 onward (0 before). Can DIFFER from the non-IRA value (e.g. Non-Preferred tier: non-IRA $99 vs IRA $35).
ira_retail_standard_copay_2mdouble
ira_retail_standard_copay_3mdouble90-day retail standard copay under the IRA standard benefit. 2024+ only.
ltc_partner_coins_1mdoubleNon-IRA 30-day LTC pharmacy coinsurance percent for this tier.
ltc_partner_copay_1mdoubleNon-IRA 30-day long-term-care (LTC) pharmacy copay for this tier.
mail_order_days_supply_1mdouble
mail_order_days_supply_2mdouble
mail_order_days_supply_3mdouble
mail_order_days_supply_basisstring
mail_order_preferred_coins_1mdouble
mail_order_preferred_coins_2mdouble
mail_order_preferred_coins_3mdouble
mail_order_preferred_coins_other_supplydouble
mail_order_preferred_copay_1mdouble
mail_order_preferred_copay_2mdouble
mail_order_preferred_copay_3mdouble
mail_order_preferred_copay_dailydouble
mail_order_preferred_copay_other_supplydouble
mail_order_preferred_other_supply_daysdouble
mail_order_standard_coins_1mdouble
mail_order_standard_coins_2mdouble
mail_order_standard_coins_3mdouble
mail_order_standard_coins_other_supplydouble
mail_order_standard_copay_1mdoubleNon-IRA 30-day standard mail-order copay for this tier.
mail_order_standard_copay_2mdouble
mail_order_standard_copay_3mdoubleNon-IRA 90-day standard mail-order copay for this tier (often ~3x the 1-month).
mail_order_standard_copay_dailydouble
mail_order_standard_copay_other_supplydouble
mail_order_standard_other_supply_daysdouble
oon_pharmacy_coins_1mdoubleNon-IRA 30-day out-of-network pharmacy COINSURANCE percent for this tier. The longest-available cost-share field — populated back to 2010 (when copay columns were not). Range 0-95%.
oon_pharmacy_copay_1mdoubleNon-IRA 30-day out-of-network pharmacy copay for this tier.
oon_pharmacy_days_supply_1mdouble
partd_catastrophic_statutory_basisstring
partd_catastrophic_statutory_coinsurance_pctdouble
partd_catastrophic_statutory_min_copay_genericdouble
partd_catastrophic_statutory_min_copay_otherdouble
partd_oop_threshold_amountdouble
partd_oop_threshold_basisstring
partd_phasevarchar(31)
post_oop_amount_basisstring
post_oop_cost_share_structurestring
post_oop_covered_part_d_rulestring
post_oop_excluded_drug_cost_share_typestring
post_oop_excluded_drug_cost_share_type_codestring
post_oop_injectable_only_tierboolean
post_oop_mmp_copay_maximumdouble
post_oop_mmp_copay_minimumdouble
post_oop_reference_pricingboolean
post_oop_specialty_tierboolean
retail_days_supply_1mdouble
retail_days_supply_2mdouble
retail_days_supply_3mdouble
retail_days_supply_basisstring
retail_preferred_coins_1mdouble
retail_preferred_coins_2mdouble
retail_preferred_coins_3mdouble
retail_preferred_copay_1mdouble
retail_preferred_copay_2mdouble
retail_preferred_copay_3mdouble
retail_preferred_copay_dailydouble
retail_standard_coins_1mdouble
retail_standard_coins_2mdouble
retail_standard_coins_3mdouble
retail_standard_coins_other_supplydouble
retail_standard_copay_1mdoubleNon-IRA 30-day (1-month) copay at a standard (non-preferred) retail pharmacy for this tier. The most-used cost-share field. Populated ~2016 onward. Range observed $0-$250.
retail_standard_copay_2mdouble
retail_standard_copay_3mdoubleNon-IRA 90-day (3-month) standard retail pharmacy copay for this tier.
retail_standard_copay_dailydouble
retail_standard_copay_other_supplydouble
retail_standard_other_supply_daysdouble
senior_savings_model_insulin_cohortint
senior_savings_model_participantboolean
tier_benefit_typestringPBP code for the benefit-type of the tier (mostly '4' = 705,242; also '2', '3'). CMS PBP enumeration requiring the LMI crosswalk to decode the exact meaning.
tier_cost_share_structurestringPBP code for the cost-share structure: '2' (582,940, e.g. copay-based), '1' (202,013, e.g. coinsurance-based), with small counts of '3','4' and ~6,705 NULL. Decode via the LMI PBP description doc.
tier_drug_typestringPBP code for the drug type(s) the tier covers ('01','10','11', etc.). CMS enumeration; decode via LMI crosswalk.
tier_formulary_model_descstringFree-text description of the plan's overall formulary model (e.g. 'Preferred Generic, Generic, Preferred Brand, Non-Preferred Drug, Specialty Tier'). Same string repeats across all tiers of a plan — describes the whole model, not just this tier.
tier_idstringTier POSITION number within the plan's formulary (string '1'-'7'). Never null. tier_id=1 is the lowest/cheapest tier (typically Preferred Generic). The same position can carry different labels across plans, so the number is the structural key, the label is descriptive.
tier_includesstringPBP code flag (e.g. '1') indicating inclusion attributes of the tier. Often NULL in older years. Decode via LMI crosswalk.
tier_label_liststringHuman name(s) for the tier (e.g. 'Preferred Generic', 'Generic', 'Preferred Brand', 'Non-Preferred Drug', 'Specialty Tier', 'Select Care Drugs', 'Vaccines'). The consumer-facing tier name; varies by plan even at the same tier_id.
tier_location_ltcstringPBP location/coverage code for long-term-care pharmacy (e.g. '1'). Decode via LMI crosswalk.
tier_location_mail_order_standardstringPBP location/coverage code for standard mail-order. NULL when the tier has no standard mail-order benefit.
tier_location_oonstringPBP location/coverage code for out-of-network pharmacy (e.g. '01'). Decode via LMI crosswalk.
tier_location_retail_standardstringPBP location/coverage code for standard retail pharmacy (e.g. '111','110'). Encodes where/how the tier is covered at retail; decode via LMI crosswalk. NULL when not offered at that channel.
tier_type_idstringTier-structure scenario code. Two values: '1' (675,832 rows, the standard cost-share scenario) and '3' (116,195 rows, a second parallel scenario, e.g. preferred-vs-standard pharmacy or a different cost-share structure). REQUIRED in the grain — a plan can file both type 1 and type 3 for the same year (57,422 plan-periods do).
source_pbp_sectionvarchar(8)Constant = 'MRX_TIER'. The PBP file section these rows derive from (Medicare Rx tier section).
source_silver_tablevarchar(28)Constant = 'medicare_silver.pbp_mrx_tier'. The single upstream silver table feeding this view.
lmi_authoritiesstringURL to the LMI 'PBP Service Category Descriptions' PDF — the authoritative codebook for decoding the tier_* PBP code columns. Same authority URL on all rows.
source_urlstringCMS download URL of the originating PBP-benefits PUF zip (e.g. .../pbp-benefits-2018-q4.zip). 31 distinct = one per quarterly release; pins each row to its exact CMS source file.
sha256_content_hashstringContent hash of the source PUF file for provenance/integrity. 31 distinct — one per quarterly source release (matches the 31 year-quarter snapshots).
statutory_insulin_cap_month_amountdouble
statutory_insulin_cap_effective_fromdate
statutory_insulin_cap_basisstring
tier_type_id_note(see tier_type_id) — duplicate guard removed.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_partd_tier")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_partd_tier WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND tier_id = '<value>' AND tier_type_id = '<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_partd_tier")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_partd_tier
NoteCleaned PBP reasoning surface (categories/partd_tier/contract.yaml); raw is pbp_section_*.

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