Medicare Advantage, Part D, Medicaid

PBP outpatient hospital (cleaned view)

medicare_semantic.vw_pbp_outpatient_hospital·live·semantic_view·quarterly
Rows
N/A
Columns
67
History
2010 to 2026
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A normalized, analytics-ready semantic view of the Medicare Advantage (Part C) Plan Benefit Package (PBP) Section B9a — outpatient hospital benefits — flattening CMS's quarterly PBP submissions into one tidy enrollee cost-share record per plan, per snapshot, per outpatient-hospital sub-benefit.
  2. 2It tells you what an MA enrollee pays out-of-pocket (copay/coinsurance) for outpatient hospital services and outpatient observation, plus authorization/referral rules, for ~7,400 plans/year going back to 2010.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarteroutpatient_hospital_sub_benefit
  1. 1One row per (contract_id, plan_id, segment_id, report_year, quarter, outpatient_hospital_sub_benefit) — i.e., one enrollee cost-share record per MA plan-segment, per quarterly PBP snapshot, per outpatient-hospital sub-benefit.
  2. 2Each plan-snapshot yields exactly 2 rows: outpatient_services and outpatient_observation (179,479 plan-snapshots x 2 = 358,958 rows).
  3. 3Verified: this 6-column key has 0 duplicate excess across all 358,958 rows (MAX rows-per-group = MIN = 1).

How to read it

  1. 1Get the latest enrollee out-of-pocket cost for outpatient hospital services per MA plan for plan-year 2026, de-duplicated to one snapshot: SELECT contract_id, plan_id, segment_id, cost_share_string, copay_amount, coinsurance_pct, auth_required FROM medicare_semantic.vw_pbp_outpatient_hospital WHERE report_year=2026 AND quarter=1 AND outpatient_hospital_sub_benefit='outpatient_services'.
  2. 2Answers: 'for each 2026 MA plan, what does a member pay (flat copay or % coinsurance) for an outpatient hospital visit, and is prior auth required?' To compare across plan years, hold quarter fixed (e.g. the max quarter per year) so you don't count the same plan multiple times.

Traps

  1. 1SNAPSHOTS, NOT HISTORY — querying without filtering quarter double/triple/quadruple-counts plans. The same plan-year is republished across Q1-Q4 with identical benefits (verified: H0028/013 shows the same $40 copay across all four 2019 quarters). There is NO is_current column. To get one row per plan-year, filter to a single snapshot, e.g. the MAX(quarter) per report_year. report_year is the real history axis (2010-2026), NOT the 'quarter' column the auto-profiler labeled as time.
  2. 2MINIMAL GRAIN needs outpatient_hospital_sub_benefit — (contract_id, plan_id, segment_id, report_year, quarter) gives 179,479 rows but the table has 358,958 because every plan-snapshot has 2 rows: 'outpatient_services' and 'outpatient_observation'. Forgetting this column doubles your counts. Adding network_type/source_pbp_section/benefit_category does NOT help — they are constants (in_network / B9A / outpatient_hospital).
  3. 3has_copay / has_coinsurance are STRUCTURAL design flags, not value-present flags — has_copay=True with copay_amount NULL in 60,377 rows; has_coinsurance=True with coinsurance_pct NULL in 49,529. They mean 'the cost-share design includes this component', not 'the number was extracted'. All four has_* booleans are also nullable (NULL in 17,804 rows). To find rows with an actual dollar/percent, test copay_amount IS NOT NULL / coinsurance_pct IS NOT NULL, not the has_* flags.
  4. 4An ENTIRE family of columns is 100% NULL here because this is a shared wide schema across all PBP categories: every limit_* field, every benefit_amount* field, normalization_status/basis, aggregation_policy, and max_oop_applies. Do not expect benefit limits or dollar-allowance fields from this view — they apply to other categories (dental allowances, transportation trip caps), not outpatient hospital.
  5. 5Several 'quality/provenance' columns are constant single-values and carry NO discriminating signal in this view: numeric_amount_observability='offered_without_numeric_amounts' (MISLEADING — many numeric amounts ARE present), null_amount_reason='unknown_requires_crosswalk', offered_status='offered', confidence_tier='source_faithful', annualization_policy='not_numeric', combined_limit_policy='none_detected', consumer_document_reconciliation_status='not_checked'. Treat confidence_tier='source_faithful' + reconciliation='not_checked' as the real caveat: these are raw PBP values, NOT independently corroborated against consumer Summary-of-Benefits docs.
  6. 6copay_amount_min/max and coinsurance_pct_min/max are a PLAN-LEVEL RANGE across the plan's B9a cost-share tiers, not per-row bounds and not cross-plan statistics. copay_amount is the headline value; copay_amount_max can be much higher (differs in 55,312 rows, e.g. headline $110, max $325). Use min/max to see the full copay spread within a plan; use copay_amount/cost_share_string for the headline.
  7. 7version and quarter both look like keys but are snapshot/file attributes, not benefit dimensions. version is uniquely determined by (plan, report_year, quarter) — exactly 1 per snapshot — and changes year-over-year as plans resubmit; it is CMS's PBP file version, not part of the grain.

Columns (67)

ColumnTypeMeaning
contract_idstringCMS MA contract ID (1,680 distinct). Prefix encodes contract type: H = standard MA/MA-PD (1,644 contracts, 352,546 rows), R = regional PPO (34, 6,402 rows), E = employer/EGWP (2, 10 rows). NOT unique per row.
plan_idstringPlan number within the contract (3-digit, e.g. '001','013'; 656 distinct values). Identifies a specific benefit package; only unique in combination with contract_id and segment_id. NOT unique per row.
segment_idstringPlan benefit-package segment (mostly '0'; 26 distinct). Segments split a plan by service area with differing benefits. Part of the plan key.
versiondoubleCMS PBP software/submission file version for that snapshot (a double, e.g. 2.0,3.0,6.0). Constant within a (plan, report_year, quarter) — verified exactly 1 version per snapshot. It is a provenance/file-version attribute, NOT a benefit value and NOT part of the grain; it changes year-over-year as plans resubmit.
report_yeardoublePlan/benefit year the PBP describes (2010-2026). The PRIMARY time dimension — pair with quarter. (Note: the auto-profiler mislabeled 'quarter' as the time column; the real history axis is report_year.)
quarterdoubleThe quarterly CMS PBP republication snapshot (1-4) within report_year. Same plan-year is republished across multiple quarters with (almost always) identical benefits — these are SNAPSHOTS, not benefit changes. 2010-2017 have only Q1; later years have 2-4 quarters. Part of the grain but functions as a snapshot/version axis.
benefit_categorystringConstant = 'outpatient_hospital' for every row. A view-scoping label, carries no discriminating information.
cost_share_stringstringHuman-readable headline cost share, e.g. '20.0%', '$40.0 copay', '$0 copay', '0.0%'. Filled 235,089/358,958 (65%). The most useful single field for 'what does the enrollee pay'. NULL when the plan's cost share for this sub-benefit was not extractable.
copay_amountdoubleHeadline/primary per-visit copay dollars (filled 151,589). 0.0 is a real value ($0 copay). NULL when the cost share is coinsurance-based or absent. This is the PRIMARY value; the plan may have additional copay tiers captured by copay_amount_min/max.
coinsurance_pctdoubleHeadline coinsurance percentage the enrollee pays (filled 87,713; e.g. 20.0 = 20%). NULL when the cost share is a flat copay or absent. Mutually-typical-exclusive with copay_amount per row.
limit_textstring100% NULL in this view. Free-text benefit limit; not applicable to outpatient hospital (a shared wide schema field used by other PBP categories like allowances/trip limits).
auth_requiredbooleanBoolean: does the plan require prior authorization for this benefit. True in 193,312 rows, False in 52,952, NULL in 112,694 (the flag is genuinely nullable / not-coded for older or incomplete snapshots).
referral_requiredbooleanBoolean: referral required for this benefit. True 56,504 / False 189,760 / NULL 112,694. Nullable; NULLs co-occur with auth_required NULLs.
network_typevarchar(10)Constant = 'in_network' for all 358,958 rows. This view carries only in-network B9a cost shares; out-of-network is not represented here.
max_oop_appliesboolean100% NULL in this view. Intended to flag whether the benefit counts toward the plan MOOP; not populated for outpatient hospital.
limit_quantitydouble100% NULL. Numeric benefit-limit quantity; not applicable here (shared-schema field).
limit_unitstring100% NULL. Unit for a benefit limit; not applicable here.
limit_period_codestring100% NULL. Period code for a benefit limit; not applicable here.
limit_period_labelstring100% NULL. Human label for the limit period; not applicable here.
limit_quantity_per_yeardouble100% NULL. Annualized limit quantity; not applicable here.
benefit_amountdouble100% NULL in this view. Dollar allowance/credit amount (used by allowance-type benefits e.g. dental/OTC); outpatient hospital has no allowance, so always empty.
benefit_amount_kindstring100% NULL. Type of the allowance amount; not applicable here.
benefit_amount_period_codestring100% NULL. Period code for the allowance; not applicable here.
benefit_amount_period_labelstring100% NULL. Period label for the allowance; not applicable here.
benefit_amount_annualizeddouble100% NULL. Annualized allowance; not applicable here.
benefit_amount_pmpmdouble100% NULL. Allowance expressed per-member-per-month; not applicable here.
normalization_statusstring100% NULL in this view. Pipeline normalization status; not populated for this category.
normalization_basisstring100% NULL. Basis used for amount normalization; not populated here.
aggregation_policystring100% NULL. Policy describing how sub-values were aggregated; not populated here.
offered_statusvarchar(15)Constant = 'offered' for all rows. Indicates the benefit is offered by the plan; no discriminating value in this view.
numeric_amount_observabilityvarchar(31)Constant = 'offered_without_numeric_amounts' for all 358,958 rows. MISLEADING in this view: despite this flag, copay_amount is populated 151,589 times and coinsurance_pct 87,713 times. Treat it as a stale/non-discriminating metadata tag, NOT as evidence that numbers are missing.
null_amount_reasonvarchar(30)Constant = 'unknown_requires_crosswalk' for all rows. A boilerplate reason string; non-discriminating here and not reliable given that many numeric amounts are in fact present.
annualization_policyvarchar(17)Constant = 'not_numeric' for all rows. Non-discriminating in this view.
combined_limit_policyvarchar(29)Constant = 'none_detected' for all rows. Non-discriminating in this view.
consumer_document_reconciliation_statusvarchar(11)Constant = 'not_checked' for all rows. Indicates the cost share has NOT been reconciled against consumer-facing Summary-of-Benefits documents. Non-discriminating here; a caveat that these are source-faithful PBP values, not consumer-doc-verified.
confidence_tiervarchar(23)Constant = 'source_faithful' for all rows. Means the values faithfully reflect the raw CMS PBP source (not independently corroborated). Non-discriminating.
benefit_layerstring
blood_three_pint_deductible_waivedboolean
blood_three_pint_waiver_basisstring
coinsurance_pct_maxdoubleMaximum coinsurance % across the cost-share tiers within this plan's B9a section (range upper bound). Filled when coinsurance present. Equals coinsurance_pct when there is a single tier.
coinsurance_pct_mindoubleMinimum coinsurance % across the plan's B9a tiers (range lower bound).
copay_amount_maxdoubleMaximum copay dollars across ALL copay tiers in the plan's B9a section — the RANGE upper bound, NOT a per-row value. Differs from copay_amount/copay_amount_min in 55,312 rows (e.g. headline $110 but max $325). Use this to see the full copay spread, not just the headline.
copay_amount_mindoubleMinimum copay dollars across the plan's copay tiers (range lower bound); typically equals copay_amount (the headline).
cost_share_period_codestringPeriod the cost share applies over, when present (filled only 48,482; 310,476 NULL). Observed codes: '1' (9,462), '2' (38,472), '3' (548) — CMS PBP period codes (e.g. per-day vs per-stay vs per-period). NULL is the common case (period unspecified / per-visit).
cost_share_period_labelstring
cost_share_period_textstring
deductible_amountdouble
deductible_basisstring
has_coinsurancebooleanBoolean STRUCTURAL flag: the plan's cost-share design includes a coinsurance component. CAUTION: True with coinsurance_pct NULL in 49,529 rows — it does NOT mean a numeric % was extracted. Also itself NULL in 17,804 rows.
has_copaybooleanBoolean STRUCTURAL flag: cost-share design includes a copay component. CAUTION: True with copay_amount NULL in 60,377 rows (and a handful False-with-amount). Does NOT imply a numeric copay is present; itself NULL in 17,804 rows. (Explains sample rows where has_copay=true on a coinsurance-only line.)
has_deductiblebooleanBoolean: a deductible applies to this benefit. Almost always False (340,620), True in 534, NULL in 17,804. Note no deductible DOLLAR amount is carried in this view.
has_max_enrollee_oopbooleanBoolean: a benefit-specific max enrollee OOP applies. Mostly False (341,154 non-null), True in 534, NULL in 17,804.
label_notestring
max_enrollee_oop_amountdouble
max_enrollee_oop_period_codestring
max_enrollee_oop_period_labelstring
max_enrollee_oop_period_textstring
max_enrollee_oop_type_codestring
max_enrollee_oop_type_labelstring
outpatient_hospital_sub_benefitstringSplits each plan-snapshot into exactly 2 rows: 'outpatient_services' and 'outpatient_observation' (179,479 each). THE row-doubling dimension and part of the grain. Both map to PBP section B9a; observation is the dedicated observation-stay cost share, services is general outpatient hospital.
registry_l2_idstring
supplemental_benefit_typestring
source_pbp_sectionvarchar(3)Constant = 'B9A' for all rows. The CMS PBP section these benefits come from (outpatient hospital). Non-discriminating.
source_silver_tablevarchar(42)Constant = 'medicare_silver.pbp_section_b9_outpat_hosp'. Lineage pointer to the upstream silver table this view is built from.
lmi_authoritiesstringConstant URL to the CMS/LMI 'PBP Service Category Descriptions' PDF (the authoritative benefit-definitions document). A provenance/definition reference, same for every row.
source_urlstringCMS source ZIP the snapshot came from, e.g. 'https://www.cms.gov/files/zip/pbp-benefits-2022-quarter-2.zip'. 31 distinct values = 31 (year,quarter) snapshots ingested. 1:1 with sha256_content_hash.
sha256_content_hashstringSHA-256 of the source ZIP content for that snapshot (31 distinct, 1:1 with source_url). Provenance/integrity fingerprint identifying the exact ingested file.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_outpatient_hospital")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_outpatient_hospital WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND outpatient_hospital_sub_benefit = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_pbp_benefit
Identity keycontract_id,plan_id,segment_id,report_year,quarter,outpatient_hospital_sub_benefit
Joinhow_to_join(source_fqn="medicare_semantic.vw_pbp_outpatient_hospital")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_outpatient_hospital
NoteCleaned PBP reasoning surface (categories/outpatient_hospital/contract.yaml); raw is pbp_section_*.

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