Medicare Advantage, Part D, Medicaid
PBP snf (cleaned view)
medicare_semantic.vw_pbp_snf·live·semantic_view·quarterlyRows
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
- 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.
- 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.
- 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
| Key | Grain |
|---|---|
contract_idplan_idsegment_idreport_yearquarter |
|
How to read it
- 1Compare in-network SNF out-of-pocket exposure across MA plans for a given year.
- 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
- 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~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).
- 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.
- 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.
- 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.
- 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)
| Column | Type | Meaning |
|---|---|---|
contract_id | string | CMS 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_id | string | Plan 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_id | string | Plan 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. |
version | double | PBP 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_year | double | PBP 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. |
quarter | double | PBP 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_category | string | Constant 'snf' for every row. Identifies this as the SNF benefit family. Carries no information within this view. |
cost_share_string | string | Human-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_amount | double | SNF 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_pct | double | HARD-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_text | string | HARD-CODED NULL (placeholder for schema parity with sibling PBP benefit views). Always null. Ignore. |
auth_required | boolean | Prior 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_required | boolean | Referral required (boolean, from pbp_b2_refer_yn). true/false/null. null = flag absent. |
network_type | varchar(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_applies | boolean | HARD-CODED NULL placeholder. Always null. Ignore (use has_max_enrollee_oop instead for the boolean signal). |
limit_quantity | double | HARD-CODED NULL placeholder. Always null. Ignore. |
limit_unit | string | HARD-CODED NULL placeholder. Always null. Ignore. |
limit_period_code | string | HARD-CODED NULL placeholder. Always null. Ignore. (Profiler listed this as a candidate key column, but it is 100% null and meaningless here.) |
limit_period_label | string | HARD-CODED NULL placeholder. Always null. Ignore. |
limit_quantity_per_year | double | HARD-CODED NULL placeholder. Always null. Ignore. |
benefit_amount | double | HARD-CODED NULL placeholder (generic plan-funded benefit amount, not applicable to SNF cost-sharing). Always null. Ignore. |
benefit_amount_kind | string | HARD-CODED NULL placeholder. Always null. Ignore. |
benefit_amount_period_code | string | HARD-CODED NULL placeholder. Always null. Ignore. (Listed as a profiler candidate key but is 100% null.) |
benefit_amount_period_label | string | HARD-CODED NULL placeholder. Always null. Ignore. |
benefit_amount_annualized | double | HARD-CODED NULL placeholder. Always null. Ignore. |
benefit_amount_pmpm | double | HARD-CODED NULL placeholder. Always null. Ignore. |
normalization_status | string | HARD-CODED NULL placeholder. Always null. Ignore. |
normalization_basis | string | HARD-CODED NULL placeholder. Always null. Ignore. |
aggregation_policy | string | HARD-CODED NULL placeholder. Always null. Ignore. |
offered_status | varchar(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_observability | varchar(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_reason | varchar(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_policy | varchar(17) | Constant 'not_numeric' (because benefit_amount is always null, nothing to annualize). Carries no information here. |
combined_limit_policy | varchar(29) | Constant 'none_detected'. Carries no information here. |
consumer_document_reconciliation_status | varchar(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_tier | varchar(23) | Constant 'source_faithful' — values are taken faithfully from the PBP source with no cross-document upgrade. Provenance flag. |
additional_days_amount | double | |
additional_days_benefit_type_code | string | |
additional_days_benefit_type_label | string | |
additional_days_cost_share_tier_count | string | |
additional_days_cost_varies_by_tier | boolean | |
additional_days_limit_code | string | |
additional_days_offered | boolean | |
additional_days_unlimited | boolean | |
bendesc_yn_answer | boolean | |
benefit_layer | varchar(38) | |
benefit_period_code | string | PBP 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_label | string | Human 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_text | string | |
coinsurance_structure_same_as_medicare_covered | boolean | |
copay_amount_max | double | |
copay_amount_max_resolved | double | |
copay_amount_min | double | |
copay_amount_min_resolved | double | |
copay_structure_same_as_medicare_covered | boolean | |
cost_share_basis | string | |
cost_share_lowest_tier | string | |
cost_share_tier_count | string | |
cost_share_varies_by_tier | boolean | Boolean: does SNF cost-share vary by provider tier. Mostly false (124,027); true only 777; null 76,684. null = not determinable. |
deductible_amount | double | |
has_coinsurance | boolean | Boolean 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_copay | boolean | Boolean 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_deductible | boolean | |
has_discharge_cost_share | boolean | |
has_max_enrollee_oop | boolean | Boolean: a max enrollee out-of-pocket applies to SNF. Almost always false; true in a small number of rows (~942). |
layer_benefit_type_code | string | |
layer_benefit_type_label | string | |
max_enrollee_oop_amount | double | |
max_enrollee_oop_period_code | string | |
original_medicare_cost_share_charged | boolean | |
prior_hospitalization_days_basis | string | |
prior_hospitalization_days_required | string | STRING 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_required | boolean | Boolean: 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_allowed | boolean | |
snf_in_package_category_list | boolean | |
snf_offered | boolean | Boolean 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_id | string | |
snf_package_match | string | |
snf_package_name | string | |
snf_package_type_code | string | |
snf_package_type_label | string | |
snf_sub_benefit | string | Constant '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_file | string | |
snf_targeting | varchar(36) | |
tier1_charges_medicare_defined_copay | boolean | |
tier1_coinsurance_interval1_begin_day | double | |
tier1_coinsurance_interval1_end_day | double | |
tier1_coinsurance_interval1_pct | double | |
tier1_coinsurance_interval2_begin_day | double | |
tier1_coinsurance_interval2_end_day | double | |
tier1_coinsurance_interval2_pct | double | |
tier1_coinsurance_interval_count | string | |
tier1_coinsurance_per_stay_pct | double | |
tier1_copay_interval1_amount | double | SNF 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_resolved | double | |
tier1_copay_interval1_begin_day | double | First covered day of interval 1 (double, typically 1.0). Defines the day range over which interval1_amount applies. |
tier1_copay_interval1_end_day | double | Last day of interval 1 (double, typically 20.0). The SNF cost ladder usually breaks at day 20. |
tier1_copay_interval2_amount | double | SNF 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_resolved | double | |
tier1_copay_interval2_begin_day | double | First day of interval 2 (double, typically 21.0). |
tier1_copay_interval2_end_day | double | Last 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_amount | double | |
tier1_copay_interval3_begin_day | double | |
tier1_copay_interval3_end_day | double | |
tier1_copay_interval_count | string | STRING 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_amount | double | |
tier1_has_copay | boolean | Boolean 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_share | boolean | |
tier2_copay_amount_max | double | |
tier2_copay_interval1_amount | double | |
tier2_copay_interval1_begin_day | double | |
tier2_copay_interval1_end_day | double | |
tier2_copay_interval2_amount | double | |
tier2_copay_interval2_begin_day | double | |
tier2_copay_interval2_end_day | double | |
tier2_copay_interval_count | string | |
source_pbp_section | varchar(2) | Constant 'B2' — the SNF section of the PBP. Provenance. |
source_silver_table | varchar(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_authorities | string | Constant 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_url | string | CMS 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_hash | string | SHA-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")
| Item | Value |
|---|---|
| Typed tools that read it | get_pbp_benefit |
| Identity key | contract_id,plan_id,segment_id |
| Join | how_to_join(source_fqn="medicare_semantic.vw_pbp_snf") |
| Raw door | Athena (read-only via query_substrate): medicare_semantic.vw_pbp_snf |
| Note | Cleaned 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