Medicare Advantage, Part D, Medicaid
PBP outpatient hospital (cleaned view)
medicare_semantic.vw_pbp_outpatient_hospital·live·semantic_view·quarterlyRows
N/A
Columns
67
History
2010 to 2026
Card
yesgrain, traps, filters
Typed tools
1
What it is
- 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.
- 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
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarteroutpatient_hospital_sub_benefit |
|
How to read it
- 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'.
- 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
- 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.
- 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).
- 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.
- 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.
- 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.
- 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.
- 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)
| Column | Type | Meaning |
|---|---|---|
contract_id | string | CMS 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_id | string | Plan 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_id | string | Plan benefit-package segment (mostly '0'; 26 distinct). Segments split a plan by service area with differing benefits. Part of the plan key. |
version | double | CMS 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_year | double | Plan/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.) |
quarter | double | The 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_category | string | Constant = 'outpatient_hospital' for every row. A view-scoping label, carries no discriminating information. |
cost_share_string | string | Human-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_amount | double | Headline/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_pct | double | Headline 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_text | string | 100% 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_required | boolean | Boolean: 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_required | boolean | Boolean: referral required for this benefit. True 56,504 / False 189,760 / NULL 112,694. Nullable; NULLs co-occur with auth_required NULLs. |
network_type | varchar(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_applies | boolean | 100% NULL in this view. Intended to flag whether the benefit counts toward the plan MOOP; not populated for outpatient hospital. |
limit_quantity | double | 100% NULL. Numeric benefit-limit quantity; not applicable here (shared-schema field). |
limit_unit | string | 100% NULL. Unit for a benefit limit; not applicable here. |
limit_period_code | string | 100% NULL. Period code for a benefit limit; not applicable here. |
limit_period_label | string | 100% NULL. Human label for the limit period; not applicable here. |
limit_quantity_per_year | double | 100% NULL. Annualized limit quantity; not applicable here. |
benefit_amount | double | 100% 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_kind | string | 100% NULL. Type of the allowance amount; not applicable here. |
benefit_amount_period_code | string | 100% NULL. Period code for the allowance; not applicable here. |
benefit_amount_period_label | string | 100% NULL. Period label for the allowance; not applicable here. |
benefit_amount_annualized | double | 100% NULL. Annualized allowance; not applicable here. |
benefit_amount_pmpm | double | 100% NULL. Allowance expressed per-member-per-month; not applicable here. |
normalization_status | string | 100% NULL in this view. Pipeline normalization status; not populated for this category. |
normalization_basis | string | 100% NULL. Basis used for amount normalization; not populated here. |
aggregation_policy | string | 100% NULL. Policy describing how sub-values were aggregated; not populated here. |
offered_status | varchar(15) | Constant = 'offered' for all rows. Indicates the benefit is offered by the plan; no discriminating value in this view. |
numeric_amount_observability | varchar(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_reason | varchar(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_policy | varchar(17) | Constant = 'not_numeric' for all rows. Non-discriminating in this view. |
combined_limit_policy | varchar(29) | Constant = 'none_detected' for all rows. Non-discriminating in this view. |
consumer_document_reconciliation_status | varchar(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_tier | varchar(23) | Constant = 'source_faithful' for all rows. Means the values faithfully reflect the raw CMS PBP source (not independently corroborated). Non-discriminating. |
benefit_layer | string | |
blood_three_pint_deductible_waived | boolean | |
blood_three_pint_waiver_basis | string | |
coinsurance_pct_max | double | Maximum 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_min | double | Minimum coinsurance % across the plan's B9a tiers (range lower bound). |
copay_amount_max | double | Maximum 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_min | double | Minimum copay dollars across the plan's copay tiers (range lower bound); typically equals copay_amount (the headline). |
cost_share_period_code | string | Period 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_label | string | |
cost_share_period_text | string | |
deductible_amount | double | |
deductible_basis | string | |
has_coinsurance | boolean | Boolean 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_copay | boolean | Boolean 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_deductible | boolean | Boolean: 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_oop | boolean | Boolean: a benefit-specific max enrollee OOP applies. Mostly False (341,154 non-null), True in 534, NULL in 17,804. |
label_note | string | |
max_enrollee_oop_amount | double | |
max_enrollee_oop_period_code | string | |
max_enrollee_oop_period_label | string | |
max_enrollee_oop_period_text | string | |
max_enrollee_oop_type_code | string | |
max_enrollee_oop_type_label | string | |
outpatient_hospital_sub_benefit | string | Splits 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_id | string | |
supplemental_benefit_type | string | |
source_pbp_section | varchar(3) | Constant = 'B9A' for all rows. The CMS PBP section these benefits come from (outpatient hospital). Non-discriminating. |
source_silver_table | varchar(42) | Constant = 'medicare_silver.pbp_section_b9_outpat_hosp'. Lineage pointer to the upstream silver table this view is built from. |
lmi_authorities | string | Constant URL to the CMS/LMI 'PBP Service Category Descriptions' PDF (the authoritative benefit-definitions document). A provenance/definition reference, same for every row. |
source_url | string | CMS 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_hash | string | SHA-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")
| Item | Value |
|---|---|
| Typed tools that read it | get_pbp_benefit |
| Identity key | contract_id,plan_id,segment_id,report_year,quarter,outpatient_hospital_sub_benefit |
| Join | how_to_join(source_fqn="medicare_semantic.vw_pbp_outpatient_hospital") |
| Raw door | Athena (read-only via query_substrate): medicare_semantic.vw_pbp_outpatient_hospital |
| Note | Cleaned 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