# PBP dme (cleaned view)

`medicare_semantic.vw_pbp_dme` · Medicare Advantage, Part D, Medicaid · status live

Cleaned source-faithful PBP dme rows: era-normalized, CMS codes decoded, with offered_status/numeric_amount_observability/null_amount_reason/annualization_policy/combined_limit_policy/confidence_tier. The agent reasoning surface for dme (vs

**Grain.** One row per Medicare Advantage plan segment, per CMS PBP release (report_year + quarter), per DME sub-benefit (dme / prosthetics / medical_supplies). Verified minimal unique key = (contract_id, plan_id, segment_id, report_year, quarter, dme_sub_benefit): all 604,464 rows are distinct on this key with zero duplicates, and it is exactly 201,488 plan-snapshots x 3 sub-benefits = 604,464. The profiler failed to find the grain because it never tested dme_sub_benefit (the column that triples each plan-snapshot).

**How to use it.** Get the current in-network DME enrollee cost share for every MA plan: SELECT contract_id, plan_id, segment_id, dme_sub_benefit, cost_share_string, coinsurance_pct, coinsurance_pct_min, coinsurance_pct_max, copay_amount, auth_required FROM vw_pbp_dme WHERE report_year = 2026 AND quarter = 1 AND dme_sub_benefit = 'dme'. Answers 'what does each Medicare Advantage plan charge a member for durable medical equipment this year, and does it need prior auth?' For a time trend, drop the year filter and group by report_year (remembering quarter republications). Join to plan/enrollment dims on (contract_id, plan_id, segment_id) to weight by membership.

**Traps.**
- NO is_current / as_of column and the table is CUMULATIVE across every CMS release 2001-2026 (a single plan appears in up to 21 years). To get 'today's' benefits you MUST filter to the latest (report_year, quarter) yourself — e.g. report_year=2026. Forgetting this multiplies every plan by ~25 snapshots.
- Time is report_year + quarter, NOT just quarter. The profiler's temporal block reports quarter (1-4) as the time column with 'earliest 1.0 / latest 4.0' — that is wrong/misleading; the real history axis is report_year (2001-2026) with quarter as a within-year republication. Early years are Q1-only; 2018+ have multiple quarters.
- A large block of columns is 100% NULL because they are template scaffolding from the shared PBP semantic-view shape that DME never fills: limit_text, max_oop_applies, referral_required, all limit_* (limit_quantity/unit/period_code/period_label/quantity_per_year), all benefit_amount_* (amount/kind/period_code/period_label/annualized/pmpm), normalization_status, normalization_basis, aggregation_policy. Do not treat these as usable fields here. limit_period_code and benefit_amount_period_code showed up as profiler 'candidate keys' ONLY because all-NULL columns collapse — they are not keys.
- Nine columns are single-value CONSTANTS across all 604,464 rows and carry no row-level signal: benefit_category='dme', network_type='in_network', offered_status='offered', numeric_amount_observability='offered_without_numeric_amounts', null_amount_reason='unknown_requires_crosswalk', annualization_policy='not_numeric', combined_limit_policy='none_detected', consumer_document_reconciliation_status='not_checked', confidence_tier='source_faithful'. (confidence_tier and offered_status also appeared in the profiler's candidate-key set despite being constants.)
- Cost share is coinsurance-dominated and expressed as a RANGE, not a single number. coinsurance_pct is always the floor (equals coinsurance_pct_min in 100% of non-null rows); coinsurance_pct_max can be higher (65,661 rows) because one row rolls up many DME line items with differing coinsurance. copay_amount is non-null on only 58K rows and is $0 ~96% of the time. cost_share_string is NULL on 109K rows but copay/coinsurance/has_* can still carry signal — NULL string != no benefit.
- The has_* boolean flags are derived INDEPENDENTLY of the headline cost_share_string and are nullable: has_coinsurance can be True even when the string says only '$0 copay' (it reflects sub-item coinsurance), and any has_* may be NULL = unknown, not False. auth_required is tri-state too: 367K true / 52K false / 185K NULL where NULL means not-specified, not 'no'.
- version is the PBP submission/amendment version (0-27) and is NOT part of the grain — the row is already deduped to one per snapshot. Do not add it to a join key expecting finer grain. Also segment_id has an EMPTY-STRING '' value (15,222 rows, only 2001-2005) that means the same as '0' (unsegmented); treat '' and '0' as equivalent or you will split/lose legacy plans. dme_sub_benefit is 100% redundant with source_pbp_section (B11A/B/C) — use either, not both, as a dimension.

| column | type | meaning |
|---|---|---|
| contract_id | string | CMS Medicare Advantage / Part D contract ID (e.g. 'H0022','H0028'). 1,972 distinct. Part of grain. Join key to plan/contract dims. |
| plan_id | string | Plan benefit package ID within the contract (e.g. '001','007','804'), zero-padded 3-char string. 656 distinct values but only unique WITHIN a contract. Part of grain. |
| segment_id | string | Plan segment ID. Mostly '0' (unsegmented, 544K rows); 1-6 for geographically segmented plans; EMPTY STRING '' for legacy 2001-2005 rows (15,222) which also means unsegmented. Part of grain. Treat '' and '0' as equivalent. |
| version | double | CMS PBP submission/amendment version number for that plan-year filing (double, 0-27). NOT part of the grain (already deduped to one row per snapshot). Higher = more amended; mass concentrated at 0-5. |
| report_year | double | Contract/benefit year of the CMS PBP release (double, 2001-2026). The primary time axis. Part of grain. 2026 is forward-looking (next plan year already published). |
| quarter | double | CMS release quarter within report_year (double, 1-4). Most early years have only Q1; 2018+ have multiple quarterly republications. Part of grain. NOTE: profiler mislabeled this as the only time column — true history is report_year+quarter. |
| benefit_category | string | Top-level benefit family. CONSTANT = 'dme' for every row (this view is DME-only). Use dme_sub_benefit to distinguish the three DME sub-services. |
| cost_share_string | string | Human-readable consumer-facing cost share, e.g. '20.0%','$0 copay','$0 copay + 10.0%','0.0%'. NULL for 109,317 rows (cost share not expressed as a simple string for that plan/vintage). Headline summary; copay_amount/coinsurance_pct are the parsed numerics. |
| copay_amount | double | Parsed flat-dollar copay (double). Non-null only 58,135 rows; of those ~96% are $0.0, tail up to $50. DME is rarely copay-based. NULL = no copay component parsed (not necessarily $0). |
| coinsurance_pct | double | Headline coinsurance percentage (double, 0-50). Non-null 452,116 rows. Modal value 20%. Equals coinsurance_pct_min in 100% of non-null cases (it is the floor of the band). |
| limit_text | string | 100% NULL across all 604,464 rows. Template scaffolding inherited from the shared PBP semantic-view shape; DME populates no benefit-limit text. |
| auth_required | boolean | Prior authorization required for the DME service (boolean). 367,072 true / 52,115 false / 185,277 NULL. NULL is meaningful = not specified in that vintage, NOT 'false'. |
| referral_required | boolean | 100% NULL. Template column; DME section does not capture referral requirements. |
| network_type | varchar(10) | Network tier the cost share applies to. CONSTANT = 'in_network' for every row. (No out-of-network rows in this DME view.) |
| max_oop_applies | boolean | 100% NULL. Template column; whether benefit counts toward MOOP is not populated for DME. |
| limit_quantity | double | 100% NULL. Template scaffolding; no DME quantity limit captured. |
| limit_unit | string | 100% NULL. Template scaffolding (would name the unit for limit_quantity). |
| limit_period_code | string | 100% NULL. Template scaffolding (period code for a quantity limit). Appeared as a 'candidate key' in the profiler purely because all-NULL collapses, NOT a real key. |
| limit_period_label | string | 100% NULL. Human label counterpart of limit_period_code; unused for DME. |
| limit_quantity_per_year | double | 100% NULL. Template scaffolding for an annualized quantity limit; unused for DME. |
| benefit_amount | double | 100% NULL. Template scaffolding (a benefit dollar allowance, e.g. for OTC/flex cards). DME has no allowance amount. |
| benefit_amount_kind | string | 100% NULL. Would classify benefit_amount (allowance/limit/etc); unused for DME. |
| benefit_amount_period_code | string | 100% NULL. Period code for benefit_amount; unused. Also a false 'candidate key' (all-NULL). |
| benefit_amount_period_label | string | 100% NULL. Human label for benefit_amount period; unused for DME. |
| benefit_amount_annualized | double | 100% NULL. Annualized benefit_amount; unused for DME. |
| benefit_amount_pmpm | double | 100% NULL. Per-member-per-month benefit_amount; unused for DME. |
| normalization_status | string | 100% NULL in this view. Would describe numeric-amount normalization; not applied because DME carries no numeric amounts here. |
| normalization_basis | string | 100% NULL. Basis for normalization; unused for DME. |
| aggregation_policy | string | 100% NULL. How multiple line items were aggregated; unused (superseded by combined_limit_policy/coinsurance band columns). |
| offered_status | varchar(15) | Whether the plan offers the benefit. CONSTANT = 'offered' for every row (this view only materializes offered DME benefits). |
| numeric_amount_observability | varchar(31) | CONSTANT = 'offered_without_numeric_amounts'. Declares that DME is offered but the source PBP B11 expresses cost share (copay/coinsurance) without dollar benefit amounts — explains why the benefit_amount/limit families are all NULL. |
| null_amount_reason | varchar(30) | CONSTANT = 'unknown_requires_crosswalk'. The standardized reason the dollar amounts are absent (a HCPCS/fee-schedule crosswalk would be needed to dollarize). |
| annualization_policy | varchar(17) | CONSTANT = 'not_numeric'. No annualization performed because there is no numeric amount to annualize. |
| combined_limit_policy | varchar(29) | CONSTANT = 'none_detected'. No combined/shared benefit limit detected across the DME sub-benefits. |
| consumer_document_reconciliation_status | varchar(11) | CONSTANT = 'not_checked'. The cost share has not been reconciled against consumer documents (SB/EOC). |
| confidence_tier | varchar(23) | CONSTANT = 'source_faithful'. Data is taken faithfully from the CMS source with no inference layer applied. (Listed as a candidate key by the profiler but it is a single constant.) |
| coinsurance_pct_max | double | Upper bound of the coinsurance range across the underlying DME line items (double). Non-null 468,428. When > min, the plan charges different coinsurance for different DME items rolled into this one row. |
| coinsurance_pct_min | double | Lower bound of the coinsurance range (double). Non-null 452,116. Always equals the headline coinsurance_pct. 386,455 rows have min=max (single rate); 65,661 have a real band. |
| copay_amount_max | double |  |
| copay_amount_min | double |  |
| dme_sub_benefit | string | Which of the three DME sub-services this row is: 'dme' (durable medical equipment, B11A), 'prosthetics' (B11B), or 'medical_supplies' (B11C). Exactly 201,488 rows each. THE column that completes the grain — every plan-snapshot has all 3. Fully redundant with source_pbp_section. |
| has_coinsurance | boolean | Flag: any coinsurance present across line items (boolean, nullable). 502,095 true. Can be True even when the headline string shows only '$0 copay' (reflects sub-item coinsurance), and can be NULL. |
| has_copay | boolean | Flag: any copay component present across the DME line items (boolean, nullable). 84,074 true. Independently derived — can be True even when cost_share_string shows no copay, and can be NULL. |
| has_deductible | boolean | Flag: a benefit-specific deductible applies (boolean). Almost always false — only 222 true rows. Rare DME deductible cases. |
| has_max_enrollee_oop | boolean | Flag: a max enrollee out-of-pocket on this benefit (boolean). Almost always false — only 1,463 true. |
| has_preferred_vendor_or_mfr | boolean | Flag: plan steers to a preferred DME vendor/manufacturer (boolean, nullable). 120,500 true. Often NULL. Signals network/vendor restriction on DME. |
| source_pbp_section | varchar(4) | CMS PBP source section: 'B11A' (DME), 'B11B' (prosthetics), 'B11C' (medical supplies). One-to-one with dme_sub_benefit. |
| source_silver_table | varchar(51) | Upstream silver table this view is built from. CONSTANT = 'medicare_silver.pbp_section_b11_dme_prosth_orth_sup' for all rows. Lineage pointer. |
| lmi_authorities | string | URL to the LMI CMS MA Benefits Mailbox PBP Service Category Descriptions PDF (the official benefit-definition authority). CONSTANT across rows. Provenance/definition reference. |
| source_url | string | CMS PBP-benefits ZIP download URL for this snapshot, e.g. 'https://www.cms.gov/files/zip/pbp-benefits-2026.zip'. Exactly one URL per (report_year, quarter). Provenance. |
| sha256_content_hash | string | SHA-256 of the source content for this snapshot. Exactly one hash per (report_year, quarter). Integrity/provenance fingerprint. |

Tools that read it: get_pbp_benefit

Query it: `query_substrate` with `SELECT ... FROM medicare_semantic.vw_pbp_dme WHERE ... LIMIT 100`; read `describe_data_source("medicare_semantic.vw_pbp_dme")` first.
