
Metabase Drill-through 下钻完整指南点击图表、表格与列头探索数据的实现原理与实战【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabaseDrill-through 是 Metabase 中最直观的交互式数据分析能力点击图表上的数据点、表格里的单元格、或任意列的表头即可弹出菜单进行筛选、查看明细记录、按时间/地理位置/类别拆分以及放大查看。本文以 Metabase 官方文档《Drill-through》为主体结合当前仓库的 MBQL 库src/metabase/lib/drill_thru/*与前端点击动作实现系统讲解下钻的运作机制、全部菜单选项的适用条件、与原生 SQL 查询的边界以及嵌入场景下的行为差异帮助你充分驾驭这一点击即分析的能力。Drill-through 如何工作Drill-through 让你通过点击 Metabase 中的图表、列头或表格单元格来探索数据。每一次点击都会弹出一个菜单其中包含类似Filter by this value按此值筛选、See these records查看这些记录、Break out by按…拆分和Zoom in放大等选项。选择其中任一选项后Metabase 会生成一个新查询并可视化其结果。从源码实现看这一过程由前后端协作完成前端将点击位置解析成点击上下文点击的列、值、所在行、以及查询中已有的分组维度调用 drills.ts 中封装的availableDrillThrus后端 MBQL 库在 drill_thru.cljc 中根据上下文逐一尝试 16 类下钻函数返回当前可用的下钻动作列表用户选择某个动作后前端再次调用drillThru见 drills.ts由后端的drill-thru-method按:type分发见 common.cljc修改查询并返回新查询最终通过 action.ts 中的performAction执行更换当前卡片并运行。核心机制每次下钻动作都会创建一个新查询并可视化结果。Metabase 会取原查询根据你点击的内容对其加以修改。切换到编辑器editor即可查看并编辑这个新查询。原问题question本身不会被改动。举例来说假设一张柱状图按产品类别和月份汇总了订单数量。点击 Widgets 系列中 4 月的柱子选择See these orders查看这些订单Metabase 会创建一个新问题把订单筛选为4 月的 Widgets。以下三点需要特别留意下钻需要查询构建权限query-building permissions。你必须对底层数据拥有创建查询的权限才能看到下钻菜单。下钻不会修改原问题。下钻会创建新问题而不会覆盖或修改你的原始问题。菜单选项取决于点击的数据类型。点击图表、列头、表格单元格或地图上的点时动作菜单中出现的选项各不相同。点击上下文与五种形态后端在 drill_thru.cljc 的 schema 定义 中注释了五种典型的点击上下文形态这决定了可用的下钻动作点击上下文形态columnvaluerowdimensions列头Column Header✔原始单元格Raw Cell✔✔✔聚合单元格Aggregated Cell✔✔✔✔透视单元格Pivot Cell✔✔✔图例项Legend Item✔其中dimensions记录的是查询中已有的分组breakout维度。例如对图例项点击时没有具体的column和value下钻作用于整条序列。Drill-through 的两种类型基于结果的下钻Results-based drill-throughMetabase 拿查询结果中的数据做筛选、分布或其他变换典型选项包括Filter by this value、Distribution、Sort。这类下钻可以用于查询构建器query builder构建的问题也适用于原生 SQL 问题。改写查询的下钻Query-rewriting drill-throughMetabase 修改你的查询本身典型选项包括See these records、Break out by、Zoom in。这类下钻只能用于查询构建器构建的问题。从实现上区分在 drill_thru.cljc 中available-drill-thrus首先会检查查询是否可编辑lib.metadata/editable?以及是否包含模板标签变量对原生查询则会通过wrap-native-query-with-mbql将查询包装为可附加过滤条件的形式——这正对应了原生 SQL 只能做结果级下钻的约束。Drill-through 菜单选项详解下钻菜单的选项取决于你点击的内容和底层数据。下表按点击对象分类说明。表格Tables对表格进行下钻可以点击列头Column headers表格单元格Table cells列头选项选项出现条件Filter by this column按此列筛选任意列Sort排序除 JSON 外的任意列Distribution分布除主键、JSON、以及 description 和 comment 字段外的任意列Sum / Average求和 / 平均值查询未汇总时的数值列Distinct values不同值查询未汇总时的任意列Sum over time按时间求和查询包含日期列且未汇总时的数值列Extract domain, host…提取域名、主机…/ Extract day, month…提取日、月…URL、邮箱和日期列Combine columns合并列文本列这些动作在源码中都有对应实现例如排序下钻见 sort.cljcschema 定义于 drill_thru.cljc schema 的::drill-thru.sort分布下钻见 distribution.cljc求和/平均值下钻见 summarize_column.cljc其支持的聚合类型限定为:avg :distinct :sum见 schema按时间求和见 summarize_column_by_time.cljc提取域名/日期见 column_extract.cljc合并列见 combine_columns.cljc。表格单元格选项选项出现条件Filter by this value按此值筛选除主键和外键外的任意列View details查看详情含有主键的行View this [related record]查看这条关联记录外键值View these [related rows]查看这些关联行外键值View these records查看这些记录聚合值Break out by [time / location / category]按时间/位置/类别拆分聚合值Automatic insights自动洞察已汇总的查询且启用了 X-rays 时单元格相关的下钻在后端由object-details详情视图、fk-details/fk-filter外键跳转、pk主键多值详情、underlying-records查看底层记录等模块提供。值得一提的是::drill-thru.pk支持多个主键同时作为维度传入见 schema 注释这是View details能处理复合主键表的实现基础。图表Charts对图表进行下钻可以点击数据点Data points图例项Legend items透视表Pivoted tables 的行为与图表类似透视表中的单元格提供与数据点相同的选项。这与透视表可视化pivot table visualization不同后者提供的下钻选项子集更小。数据点选项选项出现条件Filter by this value按此值筛选除主键和外键外的任意列View these records查看这些记录聚合值Break out by [time / location / category]按时间/位置/类别拆分聚合值Automatic insights自动洞察已汇总的查询且启用了 X-rays 时Zoom in放大直方图、分箱图表和地图See this [period] by [smaller period]按更小的时间粒度查看时间序列在时间序列或其他带连续轴的图表上你还可以点击并拖拽跨越一个范围把问题筛选到这些值。这与Filter by this value效果相同只不过作用于一段范围而非单个数据点。时间序列放大下钻的实现见 zoom_in_timeseries.cljc它要求点击维度是带year / quarter / month / week / day / hour时间粒度的日期列变换时移除现有分组、按点击值添加过滤、再用更细的时间粒度如从月到周重新分组datetime列最小可细化到minutedate列最小到day对应 schema 中的::drill-thru.zoom-in.timeseries.next-unit见 schema。地图上的地理放大见 zoom_in_geographic.cljc支持 国家→州、国家→经纬度(10°)、州→经纬度(1°)、城市→经纬度(0.1°)、经纬度→更细经纬度 等变换路径并依赖列的语义类型type/Country、type/State、type/City、type/Latitude、type/Longitude见 schema。直方图/分箱放大则由 zoom_in_bins.cljc 负责用更细的bin-width重新分箱。图例项选项点击图例项上的彩色圆点会切换该序列的显示/隐藏点击图例项的标签则打开下钻菜单。图例项上的下钻作用于整条序列而不只是某一个数据点。例如点击图例项上的View these records会显示该序列在整个图表范围内的所有行。选项出现条件View these records查看这些记录聚合值Break out by [time / location / category]按时间/位置/类别拆分聚合值Automatic insights自动洞察已汇总的查询且启用了 X-rays 时Zoom in放大直方图、分箱图表和地图See this [period] by [smaller period]按更小的时间粒度查看时间序列注意图例点击与单元格点击在上下文上的差异图例项没有column和value只有dimensions即该序列对应的分组维度。因此 underlying-records.cljc 中明确区分了点击某个分组桶查看明细与点击多序列图例查看整条序列明细两种场景前者会加STATE New York之类的过滤后者则按图例对应维度筛选整条序列。Drill-through 与原生 SQL用查询构建器创建查询时Metabase 可以读取并修改你的查询因此所有下钻动作都可用。用原生 SQL 编辑器写查询时Metabase 会执行你的 SQL但不会解析它。它可以修改结果但无法修改查询本身。这意味着可以使用基于结果的下钻不能使用改写查询的下钻。原生 SQL 问题上可用原生 SQL 问题上不可用Filter by this value按此值筛选See these records查看这些记录Distribution分布Break out by按…拆分Sort排序Zoom in放大要在原生 SQL 问题上使用下钻你必须先保存该问题。关于两类下钻的更多说明参见上文 Drill-through 的两种类型。让原生 SQL 问题可交互下钻无法改写原生 SQL 查询但你仍然可以通过自定义点击行为custom click behavior让原生 SQL 图表变得可交互。做法是把问题添加到仪表板然后在卡片上设置点击行为。自定义点击行为会用你定义的动作替换下钻菜单。它可以把你带到另一个问题、仪表板、外部 URL或更新当前仪表板上的过滤器。为点击值设置一个仪表板过滤器dashboard filter即可限定目标范围。用 transform 组合原生 SQL 与完整下钻如果你既需要原生 SQL又想使用完整的下钻菜单可以把你的 SQL 查询写成一个 transform数据变换再用查询构建器构建面向用户的查询。编写 transform 的 SQL 时让它返回明细记录而不是汇总结果在查询构建器中基于 transform 的表构建查询这些查询支持完整下钻菜单下钻动作只能触达 transform 表所包含的数据。要创建 transform你需要 transform 权限。如果使用 Metabase Cloud还需要transform 附加组件add-on。这一方案的原理与下钻实现中的wrap-native-query-with-mbql一脉相承下钻本身不解析 SQL但 transform 把 SQL 抽象成了可查询的表查询构建器生成的 MBQL 查询自然可被改写。Drill-through 与嵌入Embedding下钻行为取决于嵌入类型因为下钻需要一个拥有查询权限的 Metabase 用户。嵌入类型下钻行为已认证的模块化嵌入Authenticated modular embedding完整下钻受限于该用户的权限访客模块化嵌入Guest modular embeds无下钻全应用嵌入Full app embedding完整下钻公开嵌入Public embeds无下钻要在模块化嵌入中关闭下钻可以在创建嵌入时使用Allow people to drill through on data points允许用户对数据点进行下钻设置。在仪表板中可以用自定义点击行为覆盖单张卡片上的下钻。此外你还可以通过模块化嵌入 SDK 插件在嵌入式应用中自定义部分下钻菜单选项与点击行为。下钻的替代方案在仪表板上你可以用其他点击动作替换下钻自定义点击行为Custom click behavior把用户送到另一个问题、仪表板、外部 URL或更新当前仪表板上的过滤器交叉筛选Cross-filtering更新仪表板上多张卡片的过滤器。在卡片上设置上述任一替代方案都会替换该卡片的下钻菜单。源码视角下钻动作的注册与分发最后从仓库源码梳理一下下钻动作的完整清单方便你对照排查为什么某个选项没有出现。在 drill_thru.cljc 的available-drill-thru-fns中注册了 16 个下钻函数逐一对应前端菜单选项下钻模块源码文件对应菜单能力automatic_insights.cljcAutomatic insights自动洞察column_filter.cljcFilter by this column列头筛选distribution.cljcDistribution分布fk_filter.cljc外键关联筛选object_details.cljcView details详情pivot.cljcBreak out by按时间/位置/类别拆分quick_filter.cljcFilter by this value按值快速筛选sort.cljcSort排序summarize_column.cljcSum / Average / Distinct valuessummarize_column_by_time.cljcSum over time按时间求和column_extract.cljcExtract domain / day 等提取动作combine_columns.cljcCombine columns合并列underlying_records.cljcView these records查看明细记录zoom_in_timeseries.cljc时间序列按更细粒度查看zoom_in_geographic.cljc地图地理放大zoom_in_bins.cljc直方图/分箱放大其中zoom-in-geographic与zoom-in-binning两个函数标记为:return-drills-for-dimensions? true见 drill_thru.cljc意味着它们会针对点击上下文中的每个分组维度分别返回下钻动作而不是只针对点击的那一列——这也解释了为什么在地图上点击某个分组值时菜单会为各个维度都提供放大选项。在下钻动作是否出现的前置判断上drill_thru.cljc 要求查询必须可编辑editable?且不含模板标签变量而点击值为 SQLNULL与没有值点击的是列头在实现中也被严格区分NULL用哨兵值:null表示见 common.cljc这会影响快速筛选类下钻对空值的处理方式。结语Drill-through 把提问—看结果—再提问的分析循环压缩成了一次次点击无论是按值筛选、查看聚合背后的明细行、按时间/位置/类别重新拆分还是在地图与直方图上逐级放大Metabase 都会生成全新的、可继续编辑的查询且绝不改动原问题。理解两类下钻基于结果 vs 改写查询的边界善用列头/单元格/数据点/图例四种点击上下文再配合自定义点击行为与 transform 方案补齐原生 SQL 场景你就能在自己的数据上搭建出层层递进、可自由探索的分析体验。【免费下载链接】metabaseThe easy-to-use open source Business Intelligence and Embedded Analytics tool that lets everyone work with data :bar_chart:项目地址: https://gitcode.com/GitHub_Trending/me/metabase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考