[metabase]高级使用技巧1 geojson导入和图表,动态sql执行, 动态过滤,动态分组,动态列

本文

本文是metbase的高级技巧分享,主要包括:geojson导入和图表,动态sql执行, 动态过滤,动态分组,动态列

metabase中使用geojson

为了呈现下图中的按地区归属的用户数信息:
在这里插入图片描述

操作步骤

1,加入metabase geo json地址:

点击右上角admin settings-》settings -> Maps --> Add a map:
在这里插入图片描述
这里需要一个url,我们可以从安利云的datav里面获取:
访问: https://datav.aliyun.com/portal/school/atlas/area_selector
选择合适的地理位置(比如我只关心四川省的)
在这里插入图片描述

拷贝这里的geojson的url即可:

https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=510000_full

2、创建相关的dashboard

假设我有一个user表:

create table user(
id int primary key,
province_id int,
city_id int,
name varchar
);

如下的查询统计用户地区及用户数:

select city_id, count(*) from user
where province_id = 510000 and city_id is not null
GROUP BY  city_id

选择visulation -》 maps, 然后勾选region map为前面创建的即可
在这里插入图片描述

复杂SQL执行

在metabase中原生不支持多语句的sql执行gitub讨论,但是如果真的是较复杂的业务 需要使用到sql编写的场景,则依赖手动修改实现。
本文描述了一种方法让metabase支持多行sql执行,并获取最后一个结果集作为最终结果集。

该方法修改了mysql底层的mariadb driver以支持多语句执行效果:github

主要代码在:ProxyedSqlComponent.java
然后
(1)替换metabase.jar 中的相关driver类即可:
已经构建好的镜像:(使用方式同:https://blog.youkuaiyun.com/scugxl/article/details/150004029)

docker pull edwardg/metabase:v0.54.9.1

示例的dockerfile:

FROM metabase/metabase:v0.54.9

# 安装zip工具
USER root
RUN apk update && apk add --no-cache zip

# 创建临时工作目录
WORKDIR /tmp

COPY mariadb-java-client-2.7.10.jar mariadb-java-client-2.7.10.jar

# 使用单层RUN命令进行所有操作
RUN unzip /app/metabase.jar -d metabase-extracted && \
    unzip /tmp/mariadb-java-client-2.7.10.jar -d mariadb-extracted && \
    cp -r mariadb-extracted/org/mariadb/jdbc/Driver* metabase-extracted/org/mariadb/jdbc/ && \
    cp -r mariadb-extracted/org/mariadb/jdbc/ProxyedSqlComponent* metabase-extracted/org/mariadb/jdbc/ && \
    cd metabase-extracted && \
    zip -r /app/metabase.jar ./* && \
    rm -rf /tmp/metabase-extracted /tmp/mariadb-extracted /tmp/mariadb-java-client-2.7.10.jar

# 恢复工作目录
WORKDIR /app

(2)在database configuration中加入 allowMultiQueries=true
在这里插入图片描述

复杂sql测试

假设我添加了1个filter,指定不同的group by, 然后按group by auth status 的话 就有 auth status, count(id) 2列, 如果group by org_id 的话就有province_id, city_id, count(id) 3列, 注意到我们这里实现了一个不同的groupby有不同列的效果,都是动态的, 那么sql如下:

-- 动态排序(添加ORDER BY clause)
SET @group_by_field = {{group_field}};

-- 拼接动态SQL(包含过滤和排序)
SET @sql = CONCAT(
        'SELECT ',
        CASE @group_by_field
            WHEN 'org_id' THEN '`province_id` AS `省`, `city_id` AS `市`, count(*) AS `count`'
            WHEN 'auth_status' THEN '`auth_status` AS `认证状态`,  count(*) AS `count`'
            END,
        ' FROM `user` ',
    -- 动态过滤
    -- 动态分组
        'GROUP BY ',
        CASE @group_by_field
            WHEN 'org_id' THEN '1,2'
            WHEN 'auth_status' THEN '1'
            END
    );

-- 预处理SQL(将@sql转换为可执行的语句)
PREPARE stmt FROM @sql;

-- 执行预处理语句
EXECUTE stmt

那么效果如下:
在这里插入图片描述
在这里插入图片描述
通过这样的效果,你可以实现任意复杂的sql统计和filter的关联组合。

总结

在本文我们介绍了geojson和分享了多语句sql在metabase中的一种hack方式。 这里是metabase系列文章的高级技巧部分。 下个博客我们介绍如何分享dashboard.

要实现**数据指标体系中的动态报表**,核心在于构建一个**灵活、可配置、自动化**的数据分析与展示系统。以下是实现动态报表的关键步骤方法: --- ### ✅ 一、什么是动态报表? 动态报表是指: > **根据用户选择的维度、指标、时间范围等条件,自动从数据源中提取数据并生成可视化报表**。 它不是固定模板,而是可以根据业务需求动态调整展示。 --- ### ✅ 二、实现动态报表的四大核心要素 | 要素 | 说明 | |------|------| | **1. 数据指标体系** | 定义好可复用的指标(如 PV、UV、转化率等)维度(如地区、设备、时间等) | | **2. 元数据管理** | 管理指标的定义、SQL 表达式、维度关联等信息,供动态查询使用 | | **3. 查询引擎** | 能根据用户选择的维度指标,动态生成 SQL 或查询语句 | | **4. 前端展示平台** | 提供拖拽、筛选、配置等功能,供用户自由组合报表 | --- ### ✅ 三、技术实现方案 #### 1. 使用 BI 工具(推荐) - **帆软报表(FineReport)** - **SmartBI** - **Tableau** - **Power BI** - **Metabase** - **Superset** 这些工具支持: - 指标/维度动态配置 - 可视化拖拽 - 自动化生成 SQL - 权限控制与定时任务 #### 2. 自建系统(适合中大型企业) ##### (1)后端设计 - **元数据表结构示例:** ```sql CREATE TABLE metrics ( id INT PRIMARY KEY, name VARCHAR(100), -- 指标名称,如“订单总数” expression TEXT, -- SQL 表达式,如 COUNT(order_id) category VARCHAR(50) -- 所属分类,如“销售类” ); CREATE TABLE dimensions ( id INT PRIMARY KEY, name VARCHAR(100), -- 维度名称,如“地区” column_name VARCHAR(100), -- 数据库字段名,如 region table_name VARCHAR(100) -- 所属表名 ); ``` ##### (2)动态 SQL 生成逻辑(伪代码) ```java public String buildQuery(List<String> metrics, List<String> dimensions, String timeRange) { String selectClause = buildSelect(metrics); String groupByClause = buildGroupBy(dimensions); String whereClause = buildWhere(timeRange); return "SELECT " + selectClause + " FROM orders " + whereClause + " GROUP BY " + groupByClause; } ``` ##### (3)前端展示(推荐框架) - **ECharts / Chart.js**(图表库) - **Vue / React**(前端框架) - **Ant Design / Element UI**(组件库) --- ### ✅ 四、动态报表的关键能力 | 能力 | 说明 | |------|------| | 动态筛选 | 时间范围、地区、产品等条件自由筛选 | | 多维度分析 | 支持按不同维度组合查看数据 | | 指标自由组合 | 用户可选择多个指标进行对比 | | 图表类型切换 | 支持柱状图、折线图、饼图等切换 | | 自动刷新与定时任务 | 支持定时生成报表或自动刷新数据 | --- ### ✅ 五、案例说明:电商销售动态报表 - **用户选择:** - 指标:销售额、订单数、客单价 - 维度:地区、产品类别、月份 - 时间:2024年1月 - 2024年6月 - **系统自动生成 SQL:** ```sql SELECT region, category, month, SUM(sales) AS total_sales, COUNT(order_id) AS total_orders, SUM(sales)/COUNT(DISTINCT user_id) AS avg_order_value FROM sales_data WHERE month BETWEEN '2024-01' AND '2024-06' GROUP BY region, category, month; ``` --- ### ✅ 六、总结对比 | 方式 | 是否推荐 | 说明 | |------|----------|------| | 使用 BI 工具 | ✅✅✅ 强烈推荐 | 快速搭建,功能完善 | | 自建系统 | ✅ 推荐 | 灵活性高,适合有数据中台的企业 | | 固定报表 | ❌ 不推荐 | 缺乏灵活性,维护成本高 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值