Medicare Advantage, Part D, Medicaid

PBP dental (cleaned view)

medicare_semantic.vw_pbp_dental·live·semantic_view·quarterly (CMS republishes the PBP package multiple times per benefit year; report_year + quarter together identify the snapshot)
Rows
N/A
Columns
107
History
report_year 2001 (quarter 1) to report_year 2026 (quarter 1) — 26 distinct benefit years 2001-2026
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1A semantic view over CMS Medicare Advantage Plan Benefit Package (PBP) Section B16 — the DENTAL benefit.
  2. 2One row describes how a specific MA plan covers a dental benefit component (overall dental, or the Medicare-covered / diagnostic-preventive / comprehensive sub-benefits): its cost share (copay or coinsurance), frequency/limit, auth & referral rules, and the CMS Mandatory/Optional supplemental-benefit classification.
  3. 3It is the dental slice of the broader PBP semantic layer (sibling views like vw_pbp_* exist per benefit), used to answer 'what does plan X charge for dental and how often is it covered'.

Grain

KeyGrain
contract_idplan_idsegment_idreport_yearquartersource_pbp_section
  1. 1One row per MA plan-segment per benefit year/quarter snapshot per PBP dental section.
  2. 2The MINIMAL verified-unique key is contract_id + plan_id + segment_id + report_year + quarter + source_pbp_section (231,468 distinct = 231,468 total rows, exact). source_pbp_section is the benefit-component axis: 'B16' = the single overall dental row (186,498 rows, all years), and 'B16A'/'B16B'/'B16C' = three sub-benefit rows (14,990 each) that exist ONLY for report_year 2025-2026.
  3. 3A plan in 2024 or earlier contributes 1 dental row; a plan in 2025/2026 contributes 4 (overall + 3 sub-benefits). version is NOT part of the grain — there is exactly one version per plan-snapshot, it is just CMS's carried bid-version number.

How to read it

  1. 1To get each MA plan's overall dental cost share for the 2026 benefit year: SELECT contract_id, plan_id, segment_id, cost_share_string, copay_amount, coinsurance_pct, limit_quantity_per_year, limit_period_label FROM medicare_semantic.vw_pbp_dental WHERE report_year=2026 AND source_pbp_section='B16'.
  2. 2This returns one row per plan-segment with the filed dental member cost share and frequency limit.
  3. 3For the 2025+ sub-benefit breakdown (Medicare-covered vs diagnostic/preventive vs comprehensive), drop the section filter and read B16A/B16B/B16C rows instead.

Traps

  1. 1NOT one row per plan. A 2024-or-earlier plan has 1 dental row (B16); a 2025/2026 plan has 4 (B16 overall + B16A/B/C sub-benefits). You MUST include source_pbp_section in the grain key, and filter to source_pbp_section='B16' (or dental_sub_benefit IS NULL) if you want exactly one overall-dental row per plan. Aggregating cost_share across all sections double-counts.
  2. 2version looks like a snapshot/history axis but is NOT — there is exactly one version per (contract,plan,segment,report_year,quarter), already deduped. The real time axis is report_year + quarter. There is no is_current column; dedup to a single bid version has already been done upstream.
  3. 3The entire benefit_amount dollar family (benefit_amount, _kind, _period_code, _period_label, _annualized, _pmpm) AND max_oop_applies are 100% NULL in this view — confirmed by numeric_amount_observability='offered_without_numeric_amounts'. Do NOT read a dental dollar allowance/cap from this table; it only carries copay/coinsurance and frequency limits.
  4. 4Benefit-type columns are split into TWO families by era: the *_cy2025 columns (comprehensive_cy2025, diagnostic_cy2025) populate ONLY for report_year 2025-2026; the non-suffixed columns (oral_exam, comprehensive_diagnostic, diagnostic, preventive_care) populate ONLY for report_year <=2024 — same Mandatory/Optional concept, different CMS layout. Coalesce across the pair (or filter by year) or you will see spurious nulls.
  5. 5Several columns are single-valued constants and carry no filtering power: benefit_category='dental', network_type='in_network', offered_status='offered', source_silver_table, aggregation_policy='separate_components', numeric_amount_observability, annualization_policy, combined_limit_policy, consumer_document_reconciliation_status='not_checked', confidence_tier='source_faithful', and lmi_authorities='' (empty).
  6. 6Redundant columns to avoid mistaking for independent dimensions: dental_sub_benefit maps 1:1 to source_pbp_section (adds no grain), and dental_limit_periodicity_label is an exact duplicate of limit_period_label. consumer_document_reconciliation_status='not_checked' everywhere means these are raw bid filings, NOT reconciled against consumer Summary-of-Benefits documents.

Columns (107)

ColumnTypeMeaning
contract_idstringCMS MA contract id (e.g. 'H0016'). 1,972 distinct. Part of the grain. Pairs with plan_id/segment_id to identify the plan.
plan_idstringPlan number within the contract (e.g. '001', 3-char zero-padded). 656 distinct values; only unique WITHIN a contract. Part of the grain.
segment_idstringPBP segment id (e.g. '0'), distinguishes service-area segments of the same plan. 27 distinct. Part of the grain. 26,631 distinct contract+plan+segment combinations exist.
versiondoubleCMS PBP bid version number for that plan-snapshot (double, 0-26). NOT a history axis and NOT part of the grain — there is exactly ONE version per (contract,plan,segment,report_year,quarter). Higher within a year = later corrected filing already collapsed to one row here.
report_yeardoubleBenefit/contract year the plan applies to (double, 2001-2026). The PRIMARY time axis (the profiler's 'quarter 1-4' is only the within-year republish, not the history span).
quarterdoubleCMS republish quarter within report_year (1-4). Most data is Q1; older years carry Q1-Q4 reissues, 2025/2026 so far only Q1. Part of the grain (same plan can appear in multiple quarterly reissues).
benefit_categorystringCONSTANT = 'dental' for every row (this is the dental view). Carries no information here; exists for union-compatibility with sibling PBP views.
cost_share_stringstringHuman-readable member cost share as filed, e.g. '$25.0 copay', '20.0%', '$0 copay'. Populated on 84,533 rows; NULL when the bid did not populate a numeric cost share (cost_share_populated_in_bid=false).
copay_amountdoubleDollar copay parsed from the cost share (double). Populated on 70,978 rows. Mutually exclusive with coinsurance_pct — a row carries one or the other.
coinsurance_pctdoubleCoinsurance percentage parsed from the cost share (double, e.g. 20.0 = 20%). Populated on 13,593 rows. Mutually exclusive with copay_amount.
limit_textstringFree-text limit description from the bid. Effectively unpopulated in observed data (the structured limit_* columns carry the limit instead).
auth_requiredbooleanBoolean: prior authorization required for this dental benefit component. NULL = not specified in the bid (not the same as false).
referral_requiredbooleanBoolean: referral required. NULL = not specified.
network_typevarchar(10)CONSTANT = 'in_network' for every row. This view exposes only in-network cost share; no out-of-network rows.
max_oop_appliesbooleanBoolean intended to flag whether the benefit counts toward MOOP. 100% NULL in this view — structurally unpopulated, do not rely on it.
limit_quantitydoubleRaw limit quantity as filed in the source stripe (double). Largely superseded by limit_quantity_per_year; sparsely populated.
limit_unitstringUnit for limit_quantity (e.g. visits). Sparsely populated; the normalized frequency lives in limit_quantity_per_year / frequency_per_year_annualized.
limit_period_codestringCMS periodicity code for the limit (string): 1=Every three years, 2=Every two years, 3=Every year, 4=Every six months, 5=Every three months, 6=Other/Describe. NULL on 125,815 rows (no quantified limit).
limit_period_labelstringDecoded label of limit_period_code (e.g. 'Every year', 'Every six months', 'Other, Describe'). NULL when no limit period.
limit_quantity_per_yeardoubleLimit normalized to a per-year frequency (double, 0.33-8.0, median 2 — e.g. 2 cleanings/yr). Populated on 93,608 rows. This is the analysis-ready frequency cap.
benefit_amountdoubleIntended dollar benefit/coverage cap. 100% NULL in this view — the dollar-allowance concept is NOT populated here (see numeric_amount_observability='offered_without_numeric_amounts'). Major trap: do not read a $ cap from this table.
benefit_amount_kindstringIntended kind of benefit_amount (allowance vs cap). 100% NULL.
benefit_amount_period_codestringIntended period code for benefit_amount. 100% NULL.
benefit_amount_period_labelstringIntended period label for benefit_amount. 100% NULL.
benefit_amount_annualizeddoubleIntended annualized dollar benefit. 100% NULL.
benefit_amount_pmpmdoubleIntended per-member-per-month dollar benefit. 100% NULL.
normalization_statusvarchar(14)Governance flag: 'normalized' (216,478 — limit normalized via CMS periodicity code) or 'not_applicable' (14,990 — the B16A sub-rows with no limit quantity).
normalization_basisvarchar(34)Why/how normalized: 'cms_periodicity_code' (limit converted using the period code) or 'no_limit_quantity_in_source_stripe'. Two values only.
aggregation_policyvarchar(42)CONSTANT = 'separate_components' — each dental sub-benefit/section is kept as its own row rather than aggregated. Explains the multi-row-per-plan grain.
offered_statusvarchar(15)CONSTANT = 'offered' — every row represents an offered benefit (the view does not carry not-offered placeholders).
numeric_amount_observabilityvarchar(31)CONSTANT = 'offered_without_numeric_amounts' for all rows. Confirms the benefit_amount dollar family is structurally empty in this dental view.
null_amount_reasonstringWhy a numeric amount/limit is null: 'offered_no_numeric' (134,508), 'not_null_numeric_amount' (70,978 — actually has a copay), 'inherited_limit_elsewhere' (25,982 — limit applies on a sibling component). Useful for interpreting nulls.
annualization_policyvarchar(17)CONSTANT = 'not_numeric' (no dollar amount to annualize, consistent with empty benefit_amount).
combined_limit_policyvarchar(29)CONSTANT = 'none_detected' — no cross-component combined-limit collapsing applied.
consumer_document_reconciliation_statusvarchar(11)CONSTANT = 'not_checked' — these PBP values have NOT been reconciled against consumer documents (SB/EOC). Treat as source-faithful bid data, not consumer-verified.
confidence_tiervarchar(23)CONSTANT = 'source_faithful' — values are faithfully carried from the CMS bid, no inference/enrichment beyond decoding.
benefit_layerstring
cost_share_populated_in_bidbooleanBoolean: did the bid actually populate a cost share? true on 84,533 rows (aligns exactly with cost_share_string being non-null), false on 146,935. Use to distinguish 'no cost share filed' from 'free'.
dental_blanket_filingboolean
dental_card_amountdouble
dental_card_group_indexstring
dental_card_group_namestring
dental_card_period_codestring
dental_coinsurance_maxdouble
dental_coinsurance_mindouble
dental_comprehensive_benefit_type_code_cy2025stringCMS Mandatory/Optional supplemental-benefit type CODE for COMPREHENSIVE dental, CY2025 layout. Populated ONLY for report_year 2025-2026 (B16C rows). NULL otherwise.
dental_comprehensive_benefit_type_label_cy2025stringDecoded label for the above: Mandatory / Optional / Both / Additional. Only 2025-2026.
dental_comprehensive_diagnostic_type_codestringPre-CY2025 comprehensive-diagnostic benefit-type code. Populated for report_year <=2024 (the older B16 sub-field), NULL for 2025+.
dental_comprehensive_diagnostic_type_labelstringDecoded Mandatory/Optional/Both/Additional label for the pre-2025 comprehensive-diagnostic field (<=2024).
dental_comprehensive_maxdouble
dental_comprehensive_max_csg_groupstring
dental_comprehensive_max_in_csgboolean
dental_comprehensive_offered_packagestring
dental_copay_maxdouble
dental_copay_mindouble
dental_cost_share_basisstring
dental_deductible_amountdouble
dental_deductible_appliesboolean
dental_diagnostic_benefit_type_codestringPre-CY2025 diagnostic benefit-type code (report_year <=2024).
dental_diagnostic_benefit_type_code_cy2025stringCY2025-layout diagnostic benefit-type code (B16B rows, report_year 2025-2026 only).
dental_diagnostic_benefit_type_labelstringDecoded label (Mandatory/Optional/Both/Additional) for the pre-2025 diagnostic field.
dental_diagnostic_benefit_type_label_cy2025stringDecoded label for the CY2025 diagnostic field (2025-2026).
dental_enrollee_max_amountdouble
dental_enrollee_max_appliesboolean
dental_limit_descstring
dental_limit_per_year_from_descdouble
dental_limit_periodicity_labelstringEXACT DUPLICATE of limit_period_label (same values/counts: 'Every year', 'Every six months', etc.). Redundant convenience column.
dental_limit_unlimitedboolean
dental_max_basisstring
dental_max_scopestring
dental_max_unlimitedboolean
dental_offeredboolean
dental_offered_packagestring
dental_office_visit_coinsurance_pctdouble
dental_office_visit_copaydouble
dental_office_visit_cost_share_appliesboolean
dental_optional_onlyboolean
dental_oral_exam_benefit_type_codestringPre-CY2025 oral-exam benefit-type code (report_year <=2024). No CY2025 counterpart column.
dental_oral_exam_benefit_type_labelstringDecoded Mandatory/Optional/Both/Additional label for oral exam (<=2024).
dental_package_idstring
dental_package_namestring
dental_package_type_codestring
dental_package_type_labelstring
dental_preventive_care_benefit_type_codestringPre-CY2025 preventive-care benefit-type code (report_year <=2024).
dental_preventive_care_benefit_type_labelstringDecoded Mandatory/Optional/Both/Additional label for preventive care (<=2024).
dental_preventive_maxdouble
dental_preventive_max_csg_groupstring
dental_preventive_max_in_csgboolean
dental_preventive_offered_packagestring
dental_row_grainvarchar(15)
dental_service_benefit_type_codestring
dental_service_benefit_type_labelstring
dental_service_codestring
dental_service_codes_offeredstring
dental_service_codes_optionalstring
dental_service_groupstring
dental_service_idstring
dental_service_labelstring
dental_service_scopestring
dental_sub_benefitstringWhich dental sub-benefit the row describes: NULL='overall' (B16, 186,498 rows), 'medicare_covered' (B16A), 'diagnostic_preventive' (B16B), 'comprehensive' (B16C). Maps 1:1 to source_pbp_section, so it is redundant WITH the grain key, not additive.
dental_targetingvarchar(36)
frequency_per_year_annualizeddoubleAnnualized frequency limit (double, 0.33-8.0). Same population (93,608) and range as limit_quantity_per_year — its frequency twin. NULL when no quantified frequency.
source_pbp_sectionvarchar(4)The PBP section/sub-section the row came from and the benefit-component axis of the grain: B16 (overall dental, all years), B16A (Medicare-covered), B16B (diagnostic/preventive), B16C (comprehensive). B16A/B/C exist ONLY for 2025-2026.
source_silver_tablestringCONSTANT = 'medicare_silver.pbp_section_b16_dental' — the upstream silver table this view is built from.
lmi_authoritiesstringLocal-Market-Intelligence authority tags. EMPTY STRING '' for every row (LMI enrichment is not applied to this PBP dental view).
source_urlstringProvenance: the CMS PBP-benefits ZIP this snapshot was extracted from (e.g. 'https://www.cms.gov/files/zip/pbp-benefits-2025.zip', '.../pbp-benefits-2023-quarter-4.zip'). One distinct URL per report_year/quarter.
sha256_content_hashstringContent hash of the source record for provenance/dedup integrity. Not a business key.

Query it

describe_data_source(source_fqn="medicare_semantic.vw_pbp_dental")     # the card, live
query_substrate(sql="SELECT * FROM medicare_semantic.vw_pbp_dental WHERE contract_id = '<value>' AND plan_id = '<value>' AND segment_id = '<value>' AND report_year = '<value>' AND quarter = '<value>' AND source_pbp_section = '<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_dental")
Raw doorAthena (read-only via query_substrate): medicare_semantic.vw_pbp_dental
NoteCleaned PBP reasoning surface (categories/dental/contract.yaml); raw is pbp_section_*.

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