Medicare Advantage, Part D, Medicaid

PBP inpatient psychiatric (cleaned view)

medicare_semantic.vw_pbp_inpatient_psychiatric·live·semantic_view·quarterly
Rows
N/A
Columns
173
History
2007 (report_year) to 2026 (report_year)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A semantic view over CMS Medicare Advantage Plan Benefit Package (PBP) filings exposing member cost-sharing for the inpatient psychiatric hospital benefit (PBP section B1B): per-plan, per-quarterly-snapshot copay structure (admission copay, per-day interval copays/day-counts, auth/referral requirements) for in-network inpatient psych stays.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per MA plan-segment per quarterly PBP snapshot — i.e., one row per (contract_id, plan_id, segment_id, report_year, quarter).
  2. 2Verified unique: 193,172 distinct combinations = 193,172 rows, 0 duplicates, max 1 row per key.
  3. 3The same plan recurs across multiple quarterly snapshots and across years, so the table is a longitudinal stack of snapshots, NOT a current-state table.
  4. 4There are 23,191 distinct plan-segments and 1,838 distinct contracts across 2007-2026.

How to read it

  1. 1Compare what MA plans charge members for an inpatient psychiatric stay in the latest year.
  2. 2Example: get the current admission copay per plan — SELECT contract_id, plan_id, segment_id, copay_amount, tier_1_day_interval_1_copay, tier_1_day_count_per_interval, auth_required FROM medicare_semantic.vw_pbp_inpatient_psychiatric WHERE report_year = 2026 AND quarter = (SELECT max(quarter) FROM medicare_semantic.vw_pbp_inpatient_psychiatric WHERE report_year = 2026).
  3. 3To dedup a plan to its single most-recent snapshot across years, take the row with max (report_year, quarter) per (contract_id, plan_id, segment_id).
  4. 4Use copay_amount/tier_1_day_admission_copay IS NOT NULL to restrict to plans with a captured numeric copay.

Traps

  1. 1Snapshot stacking, no is_current flag: the same plan appears in multiple quarterly snapshots — 17,470 plan-years appear in ALL 4 quarters, and many span 2-3. A plan-level query that does not pin (report_year, quarter) will multi-count plans (e.g. 2023 has 31,005 rows for only 7,766 plans). For current state, pick the latest (report_year, quarter) per (contract_id, plan_id, segment_id) — that yields exactly 23,191 rows, one per plan-segment. report_year (NOT quarter) is the benefit-year axis; the profiler mislabeled 'quarter' as the time column.
  2. 2cost_share_string is malformed: rows like '$900.0 copay + 900.0%' duplicate the copay dollar figure as a fake coinsurance percent (900% is impossible). The structured columns are correct (has_coinsurance=FALSE, coinsurance_pct=NULL there); never parse the '+ N.N%' suffix as real coinsurance. coinsurance_pct is 100% NULL table-wide, so no usable coinsurance value exists even when has_coinsurance=TRUE (flag-only).
  3. 3Many governance/limit columns are dead in this view: coinsurance_pct, limit_text, limit_quantity, limit_unit, benefit_amount and all benefit_amount_* are 100% NULL; normalization_status/basis, aggregation_policy are 100% NULL; and network_type ('in_network'), max_oop_applies (true), offered_status ('offered'), numeric_amount_observability ('offered_without_numeric_amounts'), null_amount_reason, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status ('not_checked'), confidence_tier ('source_faithful'), benefit_category, psych_tier_axis ('tier_1'), source_pbp_section/silver_table/lmi_authorities are all CONSTANT. Don't filter or pivot on these expecting variation.
  4. 4numeric_amount_observability='offered_without_numeric_amounts' is misleading: it is constant and refers to the generic benefit_amount columns, yet ~56% of rows carry real dollars in copay_amount/tier_1_day_admission_copay. Use copay_amount/tier_1_* IS NOT NULL (109,095 rows) to find plans with a captured numeric copay — not this flag. Likewise has_copay=TRUE does not imply copay_amount is populated (26,615 such rows are NULL; 13,284 have has_copay itself NULL).
  5. 5copay_amount is a duplicate of tier_1_day_admission_copay (equal in 100% of non-null cases) — they are the SAME number, not two independent cost components. The richer per-day structure lives in tier_1_day_count_per_interval + tier_1_day_interval_1_copay/interval_2_copay (e.g. ~$292/day for the first interval then $0). NULLs in auth_required (~29%), referral_required, cost_on_discharge_day (~56%), and hospital_benefit_period_code (~37%) mean 'not captured / unknown', NOT false — and NULL hospital_benefit_period_code correlates with the no-numeric-copay rows. version is pre-deduped (one per grain key); ignore it as a selector. This view is the in-network, tier-1 psych slice only — no out-of-network and no higher psych tiers.

Columns (173)

ColumnTypeMeaning
contract_idstringCMS MA contract ID (e.g. H0028). 1,838 distinct. Part of grain key.
plan_idstringPlan ID within the contract (e.g. 001, 013), zero-padded string. 656 distinct values. Part of grain key. NOT unique alone.
segment_idstringPBP plan segment (geographic/benefit subdivision of a plan), string. '0' for ~92% of rows (single-segment plans); 1-7+ exist (26 distinct) for segmented plans. Part of grain key.
versiondoubleCMS PBP file release version for that plan-quarter (double, 1-27). The view has ALREADY deduped to exactly one version per grain key (max 1 version/key, 0 multi-version keys), so you do not need to filter it — but it is not a meaningful selector either.
report_yeardoublePBP contract/benefit year (double, 2007-2026). THIS is the real year axis (the profiler mislabeled 'quarter' as the time column). Part of grain key.
quarterdoubleQuarterly CMS PBP release snapshot within the year (1.0-4.0). Early years (2007-2017), 2021, 2025, 2026 carry only Q1; 2018-2020 and 2022-2024 carry multiple quarterly snapshots. Part of grain key and the snapshot dimension — see gotchas.
benefit_categorystringConstant = 'inpatient_psychiatric' for every row (this view is pre-filtered to that benefit). Not a discriminator.
cost_share_stringstringHuman-readable cost-share summary, e.g. '$0 copay' (90,592 rows) or '$900.0 copay + 900.0%'. 313 distinct, NULL for ~44% (offered-without-numeric rows). WARNING: the '+ N.N%' suffix is a formatting BUG — it echoes the copay dollar figure as a bogus coinsurance percent (900% is nonsensical); do not parse it as coinsurance.
copay_amountdoubleFlat/admission copay in dollars (0-2,545, median $0, 313 distinct). Non-null for 109,095 rows (~56%); the rest are NULL (numeric not captured). EXACTLY equals tier_1_day_admission_copay in 100% of non-null cases (it is a copy of it).
coinsurance_pctdoubleCoinsurance percentage — 100% NULL across the entire table (0 non-null). The model does not populate it here (and correctly ignores the bogus % in cost_share_string). Treat as unavailable for this benefit.
limit_textstringFree-text benefit limit — 100% NULL in this view. Unused.
auth_requiredbooleanBoolean: prior authorization required for the inpatient psych stay. TRUE 122,762; NULL 56,687 (~29%, not captured); remainder false. NULL means unknown, not false.
referral_requiredbooleanBoolean: referral required. TRUE 37,617; NULL 17,004; remainder false. NULL = unknown.
network_typevarchar(10)varchar — CONSTANT 'in_network' for all 193,172 rows. This view contains NO out-of-network cost-share. Big scope limit.
max_oop_appliesbooleanBoolean: benefit counts toward the plan MOOP. TRUE for 100% of rows (constant, never null). Not a discriminator.
limit_quantitydoubleNumeric benefit limit quantity — 100% NULL in this view. Unused.
limit_unitstringUnit for the limit — 100% NULL. Unused.
limit_period_codestringCode for the limit period — effectively NULL/unused here (appears as a candidate-key padder in the profiler but carries no value).
limit_period_labelstringLabel for limit period — NULL/unused.
limit_quantity_per_yeardoubleAnnualized limit quantity — NULL/unused in this view.
benefit_amountdoubleGeneric benefit dollar amount — 100% NULL in this view (psych cost-share lives in the tier_1_* and copay_amount columns, not here).
benefit_amount_kindstringKind of benefit_amount — 100% NULL. Unused.
benefit_amount_period_codestringPeriod code for benefit_amount — NULL/unused (profiler key padder).
benefit_amount_period_labelstringPeriod label — NULL/unused.
benefit_amount_annualizeddoubleAnnualized benefit_amount — NULL/unused.
benefit_amount_pmpmdoublePer-member-per-month benefit_amount — NULL/unused.
normalization_statusstringGovernance field — 100% NULL in this view. Carried from generic PBP schema, unpopulated here.
normalization_basisstringGovernance field — 100% NULL. Unused.
aggregation_policystringGovernance field — 100% NULL. Unused.
offered_statusvarchar(15)varchar — CONSTANT 'offered' for all rows (every row is a plan that offers the benefit). Not a discriminator.
numeric_amount_observabilityvarchar(31)varchar — CONSTANT 'offered_without_numeric_amounts' for ALL rows. Misleading: it refers to the generic benefit_amount/copay_amount being absent, yet ~56% of rows DO carry real dollars in tier_1_day_admission_copay/copay_amount. Do not use this flag to decide whether a numeric copay exists.
null_amount_reasonvarchar(30)varchar — CONSTANT 'unknown_requires_crosswalk' for all rows. A generic default, not a per-row diagnosis.
annualization_policyvarchar(17)varchar — CONSTANT 'not_numeric' for all rows. Not a discriminator.
combined_limit_policyvarchar(29)varchar — CONSTANT 'none_detected' for all rows. Not a discriminator.
consumer_document_reconciliation_statusvarchar(11)varchar — CONSTANT 'not_checked' for all rows (no consumer-doc/EOC reconciliation has been run on this benefit). Not a discriminator.
confidence_tiervarchar(23)varchar — CONSTANT 'source_faithful' for all rows (values are faithfully copied from the PBP source). Not a discriminator.
additional_days_amountdouble
additional_days_benefit_type_codestring
additional_days_benefit_type_labelstring
additional_days_coinsurance_interval1_begin_daydouble
additional_days_coinsurance_interval1_end_daydouble
additional_days_coinsurance_interval1_pctdouble
additional_days_coinsurance_interval2_begin_daydouble
additional_days_coinsurance_interval2_end_daydouble
additional_days_coinsurance_interval2_pctdouble
additional_days_coinsurance_interval_countstring
additional_days_copay_amountdouble
additional_days_copay_interval1_amountdouble
additional_days_copay_interval1_begin_daydouble
additional_days_copay_interval1_end_daydouble
additional_days_copay_interval2_amountdouble
additional_days_copay_interval2_begin_daydouble
additional_days_copay_interval2_end_daydouble
additional_days_copay_interval_countstring
additional_days_cost_share_basisstring
additional_days_cost_share_lowest_tierstring
additional_days_cost_share_stringstring
additional_days_cost_share_tier_countstring
additional_days_cost_varies_by_tierboolean
additional_days_limit_codestring
additional_days_offeredboolean
additional_days_unlimitedboolean
benefit_layervarchar(38)
benefit_period_other_textstring
coinsurance_structure_same_as_medicare_coveredboolean
copay_amount_maxdouble
copay_amount_max_resolveddouble
copay_amount_mindouble
copay_amount_min_resolveddouble
copay_structure_same_as_medicare_coveredboolean
cost_on_discharge_daybooleanBoolean: whether a copay applies on the discharge day. FALSE 82,899, TRUE 2,214, NULL 108,059 (~56%, not captured). NULL = unknown.
cost_share_basisstring
cost_share_lowest_tierstring
cost_share_tier_countstring
cost_varies_by_tierbooleanBoolean: cost varies across a tier axis. TRUE for only 241 rows; mostly false. Combined with psych_tier_axis always = tier_1, multi-tier psych structures are essentially absent in this view.
deductible_amountdouble
has_coinsurancebooleanBoolean flag that coinsurance applies. TRUE for 38,002 rows — but coinsurance_pct is 100% NULL, so the flag exists with NO accompanying percentage value. Flag-only signal.
has_copaybooleanBoolean flag that a copay applies. TRUE 135,708. NOTE: 26,615 rows have has_copay=TRUE but copay_amount IS NULL (copay exists but dollar not captured / sits in interval copays), and 13,284 rows have has_copay = NULL. Do not equate has_copay=TRUE with copay_amount being populated.
has_deductiblebooleanBoolean: a deductible applies. TRUE for only 1,257 rows; overwhelmingly false. Rare for this benefit.
has_max_enrollee_oopboolean
hospital_benefit_period_codestringPBP benefit-period structure code (string '1'-'4', plus NULL for 70,737 rows ~37%). '3' is most common (84,346). Does NOT split the grain (one value per plan-snapshot). NULL strongly correlates with the no-numeric-copay rows (only 7,899 of 70,737 NULL-HBPC rows have a copay).
hospital_benefit_period_labelstring
inpatient_psychiatric_in_package_category_listboolean
inpatient_psychiatric_package_idstring
inpatient_psychiatric_package_matchstring
inpatient_psychiatric_package_namestring
inpatient_psychiatric_package_type_codestring
inpatient_psychiatric_package_type_labelstring
inpatient_psychiatric_targeted_filestring
inpatient_psychiatric_targetingvarchar(36)
layer_benefit_type_codestring
layer_benefit_type_labelstring
lifetime_reserve_day_copay_resolveddouble
max_enrollee_oop_amountdouble
max_enrollee_oop_period_codestring
original_medicare_cost_share_chargedboolean
part_a_deductible_amount_resolveddouble
psych_tier_axisvarchar(39)varchar — CONSTANT 'tier_1' for 100% of rows. This view only materializes the tier-1 psych slice; higher psych tiers are not represented here, which is why all tier_2+ columns are absent.
tier1_coinsurance_interval1_begin_daydouble
tier1_coinsurance_interval1_end_daydouble
tier1_coinsurance_interval1_pctdouble
tier1_coinsurance_interval2_begin_daydouble
tier1_coinsurance_interval2_end_daydouble
tier1_coinsurance_interval2_pctdouble
tier1_coinsurance_interval_countstring
tier1_copay_interval1_amountdouble
tier1_copay_interval1_amount_resolveddouble
tier1_copay_interval1_begin_daydouble
tier1_copay_interval1_end_daydouble
tier1_copay_interval2_amountdouble
tier1_copay_interval2_amount_resolveddouble
tier1_copay_interval2_begin_daydouble
tier1_copay_interval2_end_daydouble
tier1_copay_interval3_amountdouble
tier1_copay_interval3_begin_daydouble
tier1_copay_interval3_end_daydouble
tier1_copay_per_stay_amountdouble
tier1_lifetime_reserve_coinsurance_interval1_begin_daydouble
tier1_lifetime_reserve_coinsurance_interval1_end_daydouble
tier1_lifetime_reserve_coinsurance_interval1_pctdouble
tier1_lifetime_reserve_coinsurance_interval2_begin_daydouble
tier1_lifetime_reserve_coinsurance_interval2_end_daydouble
tier1_lifetime_reserve_coinsurance_interval2_pctdouble
tier1_lifetime_reserve_coinsurance_interval_countstring
tier1_lifetime_reserve_days_interval_countstring
tier1_lifetime_reserve_interval1_amountdouble
tier1_lifetime_reserve_interval1_begin_daydouble
tier1_lifetime_reserve_interval1_end_daydouble
tier1_lifetime_reserve_interval2_amountdouble
tier1_lifetime_reserve_interval2_begin_daydouble
tier1_lifetime_reserve_interval2_end_daydouble
tier2_charges_medicare_defined_cost_shareboolean
tier2_copay_amount_maxdouble
tier2_copay_interval_countstring
tier2_copay_per_stay_amountdouble
tier2_lifetime_reserve_days_interval_countstring
tier2_lifetime_reserve_interval1_amountdouble
tier2_lifetime_reserve_interval1_begin_daydouble
tier2_lifetime_reserve_interval1_end_daydouble
tier2_lifetime_reserve_interval2_amountdouble
tier2_lifetime_reserve_interval2_begin_daydouble
tier2_lifetime_reserve_interval2_end_daydouble
tier3_charges_medicare_defined_cost_shareboolean
tier3_copay_interval_countstring
tier3_copay_per_stay_amountdouble
tier3_lifetime_reserve_days_interval_countstring
tier_1_consecutive_day_countstringString count of consecutive days the first cost-share interval applies (e.g. '1','2','3'). NULL ~44%. Part of the per-day cost structure.
tier_1_day_admission_copaydoubleDollar copay at admission for tier 1 (0-2,545). Non-null 109,095. Identical to copay_amount. The flat admission copay.
tier_1_day_count_per_intervalstringString defining how many day-intervals the copay schedule has (e.g. '1' = flat admission only with no per-day intervals; '3' = a multi-interval schedule with interval_1 and interval_2 copays). Drives whether the interval copay columns are populated.
tier_1_day_interval_1_begin_daydouble
tier_1_day_interval_1_copaydoublePer-day copay for the first day-interval (e.g. ~$292/day median when per_interval='3'). Non-null 87,312. Encodes 'pay $X/day for the first N days'.
tier_1_day_interval_1_end_daydouble
tier_1_day_interval_2_begin_daydouble
tier_1_day_interval_2_copaydoublePer-day copay for the second day-interval (median $0 — i.e. $0/day after the first interval in the common case). Non-null 86,845. Encodes the step-down after the initial copay days.
tier_1_day_interval_2_end_daydouble
tier_1_day_interval_3_begin_daydouble
tier_1_day_interval_3_copaydouble
tier_1_day_interval_3_end_daydouble
tier_2_day_interval_1_begin_daydouble
tier_2_day_interval_1_copaydouble
tier_2_day_interval_1_end_daydouble
tier_2_day_interval_2_begin_daydouble
tier_2_day_interval_2_copaydouble
tier_2_day_interval_2_end_daydouble
tier_2_day_interval_3_begin_daydouble
tier_2_day_interval_3_copaydouble
tier_2_day_interval_3_end_daydouble
total_covered_stay_daysdouble
source_pbp_sectionvarchar(3)varchar — CONSTANT 'B1B' (PBP Section B1B = Inpatient Hospital - Psychiatric). Provenance, not a discriminator.
source_silver_tablestringvarchar — CONSTANT 'medicare_silver.pbp_section_b1b_inpat_hosp_psych'. The upstream silver table this view is built from. Provenance.
lmi_authoritiesstringString — CONSTANT pointer URL to the CY2026 PBP Service Category Descriptions PDF (LMI MA Benefits Mailbox). Documentation reference for the benefit definition; same for every row.
source_urlstringCMS source zip URL for the snapshot (e.g. https://www.cms.gov/files/zip/pbp-benefits-2022-updated-07012022.zip). 34 distinct = one per snapshot (year+quarter). Provenance for the specific PBP release.
sha256_content_hashstringSHA-256 content hash of the source file. 34 distinct (one per snapshot zip), mirroring source_url. Integrity/provenance.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_inpatient_psychiatric")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_inpatient_psychiatric 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_inpatient_psychiatric")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_inpatient_psychiatric
NoteCleaned PBP reasoning surface (categories/inpatient_psychiatric/contract.yaml); raw is pbp_section_*.

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