Medicare Advantage, Part D, Medicaid

PBP snf (cleaned view)

medicare_semantic.vw_pbp_snf·live·semantic_view·quarterly
Rows
N/A
Columns
121
History
report_year 2001 (quarter 1) to report_year 2026 (quarter 1)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A normalized, analyst-ready view of Medicare Advantage (Part C) Skilled Nursing Facility (SNF) cost-sharing and benefit rules, derived from Section B2 of the CMS Plan Benefit Package (PBP) Public Use Files.
  2. 2One row tells you, for a given MA plan in a given benefit year/snapshot: whether SNF is offered, the day-interval copay structure (the signature SNF cost ladder), prior-hospitalization requirements, and auth/referral rules.
  3. 3It is the SNF slice of the medicare_semantic PBP family of benefit views; use it to compare SNF out-of-pocket exposure across MA plans/years.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquarter
  1. 1One row per MA plan-segment per PBP snapshot.
  2. 2The minimal verified key is contract_id + plan_id + segment_id + report_year + quarter — 201,488 distinct combinations exactly equal the 201,488 rows (no duplicates). benefit_category ('snf'), snf_sub_benefit ('snf_tier_1'), and network_type ('in_network') are all constant and add nothing to the grain. report_year+quarter together identify the PBP PUF release the row was extracted from (e.g.
  3. 32026 Q1).

How to read it

  1. 1Compare in-network SNF out-of-pocket exposure across MA plans for a given year.
  2. 2Example: SELECT contract_id, plan_id, segment_id, tier1_copay_interval1_amount AS days_1_20_copay, tier1_copay_interval2_amount AS days_21_100_copay, prior_hospitalization_required FROM medicare_semantic.vw_pbp_snf WHERE report_year=2026 AND quarter=1 AND snf_offered=true ORDER BY days_21_100_copay DESC — returns each 2026 plan's full SNF day-interval copay ladder (showing that the headline copay_amount of $0-$20 hides a ~$218/day charge after day 20), so you can rank plans by true SNF cost rather than the misleadingly cheap first-interval copay.

Traps

  1. 1copay_amount and cost_share_string are the INTERVAL-1 (days 1-20) copay ONLY — they systematically understate SNF cost. The expensive days-21-100 copay (often ~$218/day) lives in tier1_copay_interval2_amount. copay_amount is provably identical to tier1_copay_interval1_amount (97,606 equal / 0 differ).
  2. 2~18 columns are HARD-CODED NULL in the view definition (CAST(null AS ...)): coinsurance_pct, all limit_* and all benefit_amount_* columns, normalization_status/basis, aggregation_policy. They are schema-parity placeholders to match sibling PBP benefit views — verified 0 non-null. has_coinsurance can be true while coinsurance_pct is null, so you can never read the SNF coinsurance percentage from this view (go to medicare_silver.pbp_section_b2_snf).
  3. 3The offered/observability flags (offered_status, snf_offered, numeric_amount_observability, null_amount_reason) are about the (always-null) generic benefit-amount path and the pbp_b2_bendesc_yn flag — NOT about copay availability. 92,714 rows with offered_status='not_offered'/snf_offered=false STILL carry a real copay_amount. Do not filter on snf_offered to find plans-with-a-copay.
  4. 4This is a Presto VIRTUAL_VIEW with NO is_current column. Versioning is via the (report_year, quarter) snapshot itself. tier1_copay_interval_count can be '3'/'4' but the view exposes only interval 1 and interval 2 columns, so higher counts mean additional cost-ladder intervals exist in the silver source that are not surfaced here.
  5. 5Grain traps: the profiler reported a 7-column superset and flagged limit_period_code/benefit_amount_period_code as candidate keys — both are 100% null and irrelevant. The true minimal key is contract_id+plan_id+segment_id+report_year+quarter (201,488=201,488). Also segment_id has empty-string values (5,074 rows) that are distinct from '0' and break CAST-to-int; plan_id is only unique within a contract; quarter's 1-4 is the PBP release quarter, not a calendar date.
  6. 6prior_hospitalization_days_required and tier1_copay_interval_count are STRINGS (e.g. '1','3'), not numbers — cast before arithmetic. tier1_has_copay and has_copay are two different derivations that frequently disagree; prefer has_copay for a plan-level copay signal.

Columns (121)

ColumnTypeMeaning
contract_idstringCMS MA contract ID (e.g. H0084, E5088, R-/S- prefixes). 1,972 distinct. Part of grain. H=local MA/MA-PD, R=regional PPO, E=employer/group, S=PDP-adjacent.
plan_idstringPlan benefit package ID within the contract (e.g. '001','029'), 3-char zero-padded string. 656 distinct values but reused across contracts; only unique WITH contract_id. Part of grain.
segment_idstringPlan segment (geographic/benefit segment) within the plan, string. Mostly '0' (181K rows); also '1'..'16'+; NOTE 5,074 rows have an EMPTY-STRING segment_id (not '0', not null) — casting it to int fails. Part of grain.
versiondoublePBP bid submission/version number for that plan-year (double, 0-27). An attribute, NOT part of the grain — there is exactly one row per plan-snapshot regardless of version. Higher = later resubmission; counts decline with version.
report_yeardoublePBP contract/benefit year (double, 2001-2026). Matches the year embedded in source_url exactly. This is the plan year the benefits apply to. Core time dimension.
quarterdoublePBP PUF release quarter within report_year (1-4). Pre-2018 is annual (Q1 only); 2018+ has multiple quarterly snapshots but NOT always all 4 (e.g. 2020 has no Q3, 2024 no Q2, 2025/2026 only Q1). This is the profiler's 'time_column' but its 1-4 range is the snapshot quarter, not a date.
benefit_categorystringConstant 'snf' for every row. Identifies this as the SNF benefit family. Carries no information within this view.
cost_share_stringstringHuman-readable label synthesized in-view from the interval-1 copay only, e.g. '$0 copay' (91K), '$20.0 copay', '$40.0 copay'. NULL for 103,882 rows. Only ever expresses copay (never coinsurance, since coinsurance_pct is hardcoded null). Do not treat as the full SNF cost — it is the days-1-20 copay label.
copay_amountdoubleSNF tier-1 copay for INTERVAL 1 ONLY (the PBP field pbp_b2_copay_mcs_amt_int1_t1, i.e. typically days 1-20). Populated in 97,606 rows; range $0-$40, median $0. IT EXACTLY EQUALS tier1_copay_interval1_amount (verified 97,606 equal / 0 differ). MAJOR TRAP: this omits the expensive later interval (days 21-100, often ~$218/day) — see tier1_copay_interval2_amount.
coinsurance_pctdoubleHARD-CODED NULL in the view definition (CAST(null AS double)). 0 non-null rows. SNF coinsurance percentage is never carried here even when has_coinsurance=true. To know coinsurance you must go to the silver source.
limit_textstringHARD-CODED NULL (placeholder for schema parity with sibling PBP benefit views). Always null. Ignore.
auth_requiredbooleanPrior authorization required for SNF (boolean, from pbp_b2_auth_yn). true=97K+, null=common (~66K where the Y/N flag was blank/unmapped). null means 'not stated', not 'no'.
referral_requiredbooleanReferral required (boolean, from pbp_b2_refer_yn). true/false/null. null = flag absent.
network_typevarchar(10)Constant 'in_network'. This view carries only in-network SNF cost-sharing; there is no out-of-network row here. Carries no information.
max_oop_appliesbooleanHARD-CODED NULL placeholder. Always null. Ignore (use has_max_enrollee_oop instead for the boolean signal).
limit_quantitydoubleHARD-CODED NULL placeholder. Always null. Ignore.
limit_unitstringHARD-CODED NULL placeholder. Always null. Ignore.
limit_period_codestringHARD-CODED NULL placeholder. Always null. Ignore. (Profiler listed this as a candidate key column, but it is 100% null and meaningless here.)
limit_period_labelstringHARD-CODED NULL placeholder. Always null. Ignore.
limit_quantity_per_yeardoubleHARD-CODED NULL placeholder. Always null. Ignore.
benefit_amountdoubleHARD-CODED NULL placeholder (generic plan-funded benefit amount, not applicable to SNF cost-sharing). Always null. Ignore.
benefit_amount_kindstringHARD-CODED NULL placeholder. Always null. Ignore.
benefit_amount_period_codestringHARD-CODED NULL placeholder. Always null. Ignore. (Listed as a profiler candidate key but is 100% null.)
benefit_amount_period_labelstringHARD-CODED NULL placeholder. Always null. Ignore.
benefit_amount_annualizeddoubleHARD-CODED NULL placeholder. Always null. Ignore.
benefit_amount_pmpmdoubleHARD-CODED NULL placeholder. Always null. Ignore.
normalization_statusstringHARD-CODED NULL placeholder. Always null. Ignore.
normalization_basisstringHARD-CODED NULL placeholder. Always null. Ignore.
aggregation_policystringHARD-CODED NULL placeholder. Always null. Ignore.
offered_statusvarchar(15)Whether SNF is offered, derived from pbp_b2_bendesc_yn (benefit-description Y/N): 'not_offered' (152,615), 'offered' (34,484), 'offered_unknown' (14,389). TRAP: this reflects the benefit-description flag, NOT whether a copay exists — 92,714 'not_offered' rows still carry a copay_amount.
numeric_amount_observabilityvarchar(31)Observability of the GENERIC benefit-amount fields (all of which are hardcoded null here): 'not_offered' (152,615) or 'offered_without_numeric_amounts' (48,873). Because benefit_amount is always null, this never says 'all_offered_numeric'. It is NOT a statement about copay availability.
null_amount_reasonvarchar(30)Why benefit_amount is null: 'not_offered' (152,615) or 'unknown_requires_crosswalk' (48,873). Again tied to the hardcoded-null benefit_amount path, not to copay.
annualization_policyvarchar(17)Constant 'not_numeric' (because benefit_amount is always null, nothing to annualize). Carries no information here.
combined_limit_policyvarchar(29)Constant 'none_detected'. Carries no information here.
consumer_document_reconciliation_statusvarchar(11)Constant 'not_checked' — rows have not been reconciled against consumer-facing documents (e.g. Medicare Plan Finder). Pipeline status flag, not a benefit attribute.
confidence_tiervarchar(23)Constant 'source_faithful' — values are taken faithfully from the PBP source with no cross-document upgrade. Provenance flag.
additional_days_amountdouble
additional_days_benefit_type_codestring
additional_days_benefit_type_labelstring
additional_days_cost_share_tier_countstring
additional_days_cost_varies_by_tierboolean
additional_days_limit_codestring
additional_days_offeredboolean
additional_days_unlimitedboolean
bendesc_yn_answerboolean
benefit_layervarchar(38)
benefit_period_codestringPBP basis-period code for the SNF cost share: '1'='Per benefit period' (108,271, the SNF standard), '2'='Per calendar year' (1,120), '3' (12,533, label unmapped), '4' (204, label unmapped); 79,360 null. 122,128 non-null overall.
benefit_period_labelstringHuman label for benefit_period_code, mapped for codes 1 and 2 only ('Per benefit period','Per calendar year'); NULL for codes 3/4 and where code is null (109,391 non-null).
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_share_basisstring
cost_share_lowest_tierstring
cost_share_tier_countstring
cost_share_varies_by_tierbooleanBoolean: does SNF cost-share vary by provider tier. Mostly false (124,027); true only 777; null 76,684. null = not determinable.
deductible_amountdouble
has_coinsurancebooleanBoolean flag that the plan uses SNF coinsurance (true=37,819). TRAP: the actual percentage (coinsurance_pct) is ALWAYS null, so this flag tells you coinsurance exists but not its value.
has_copaybooleanBoolean flag that the plan uses a SNF copay (true). Derived independently from tier1_has_copay and the two can disagree (e.g. 98,840 rows have has_copay=true while tier1_has_copay=false). Treat has_copay as the plan-level copay indicator.
has_deductibleboolean
has_discharge_cost_shareboolean
has_max_enrollee_oopbooleanBoolean: a max enrollee out-of-pocket applies to SNF. Almost always false; true in a small number of rows (~942).
layer_benefit_type_codestring
layer_benefit_type_labelstring
max_enrollee_oop_amountdouble
max_enrollee_oop_period_codestring
original_medicare_cost_share_chargedboolean
prior_hospitalization_days_basisstring
prior_hospitalization_days_requiredstringSTRING count of qualifying inpatient days required before SNF coverage: '1' (138,639), '2' (4,146), '3' (234); null when not required. Stored as text, not numeric.
prior_hospitalization_requiredbooleanBoolean: SNF requires a prior qualifying hospital stay. true=143,019, false=38,212, null=20,257. Pairs with prior_hospitalization_days_required (true→days '1'/'2'/'3').
prior_stay_less_than_3_days_allowedboolean
snf_in_package_category_listboolean
snf_offeredbooleanBoolean mirror of offered_status: true (34,484), false (152,615), null (14,389, = offered_unknown). Same caveat as offered_status — does not gate the copay fields.
snf_package_idstring
snf_package_matchstring
snf_package_namestring
snf_package_type_codestring
snf_package_type_labelstring
snf_sub_benefitstringConstant 'snf_tier_1'. This view exposes only the tier-1 SNF sub-benefit. Carries no information within the view but signals the view is NOT modeling multi-tier SNF.
snf_targeted_filestring
snf_targetingvarchar(36)
tier1_charges_medicare_defined_copayboolean
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_coinsurance_per_stay_pctdouble
tier1_copay_interval1_amountdoubleSNF tier-1 copay for day-interval 1 (typically days 1-20). Populated 97,606 rows; identical to copay_amount. The cheap early-stay copay.
tier1_copay_interval1_amount_resolveddouble
tier1_copay_interval1_begin_daydoubleFirst covered day of interval 1 (double, typically 1.0). Defines the day range over which interval1_amount applies.
tier1_copay_interval1_end_daydoubleLast day of interval 1 (double, typically 20.0). The SNF cost ladder usually breaks at day 20.
tier1_copay_interval2_amountdoubleSNF tier-1 copay for interval 2 (typically days 21-100). Populated 95,493 rows; commonly ~$218/day. THIS IS THE EXPENSIVE PART OF SNF COST that copay_amount/cost_share_string omit — must be read to assess true SNF exposure.
tier1_copay_interval2_amount_resolveddouble
tier1_copay_interval2_begin_daydoubleFirst day of interval 2 (double, typically 21.0).
tier1_copay_interval2_end_daydoubleLast day of interval 2 (double). Often 100.0 (Medicare SNF benefit max) but can be lower (e.g. 45, 51) when the plan's interval structure splits coverage further.
tier1_copay_interval3_amountdouble
tier1_copay_interval3_begin_daydouble
tier1_copay_interval3_end_daydouble
tier1_copay_interval_countstringSTRING count of day-intervals the plan defines for tier-1 SNF: '3' (72,056), '4' (23,437), '2' (2,113), '1' (1,234); null 102,648. NOTE: the count can exceed the 2 intervals exposed as columns (this view surfaces only interval 1 and 2), so '3'/'4' means additional intervals exist in the source that are NOT in this view.
tier1_copay_per_stay_amountdouble
tier1_has_copaybooleanBoolean copay indicator at the interval/tier level. Diverges from has_copay (e.g. false here while has_copay=true). Often null (102K). Prefer has_copay for a plan-level signal; treat this as interval-level metadata.
tier2_charges_medicare_defined_cost_shareboolean
tier2_copay_amount_maxdouble
tier2_copay_interval1_amountdouble
tier2_copay_interval1_begin_daydouble
tier2_copay_interval1_end_daydouble
tier2_copay_interval2_amountdouble
tier2_copay_interval2_begin_daydouble
tier2_copay_interval2_end_daydouble
tier2_copay_interval_countstring
source_pbp_sectionvarchar(2)Constant 'B2' — the SNF section of the PBP. Provenance.
source_silver_tablevarchar(47)Constant 'medicare_silver.pbp_section_b2_snf' — the silver table this view reads. To recover the hardcoded-null fields (coinsurance %, additional intervals beyond 2), go here. Provenance.
lmi_authoritiesstringConstant pipe-delimited string of two LMI (CMS contractor) reference-document URLs (CY2026 PBP Service Category Descriptions + Part C Bid Review Memorandum). Documentation pointers, not per-row data. Same for every row.
source_urlstringCMS download URL of the PBP-benefits ZIP the row came from (e.g. .../pbp-benefits-2012.zip). 40 distinct values; the embedded year matches report_year exactly; multiple URLs per year correspond to the quarterly snapshots. Provenance.
sha256_content_hashstringSHA-256 of the source file content. 40 distinct, 1:1 with source_url. Content-addressed provenance / integrity check for the source ZIP.

Query it

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

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