Quick BI使用案例02:基于人员维度的指定时间段订单分组排序

简介: 本文介绍Quick BI基于人员维度的指定时间段内订单分组排序的两种方案:通过使用占位符和ROW_NUMBER()函数建自定义SQL数据集,在明细表中实现。或者通过物理表建数据集,在交叉表中利用计算字段与累计计算实现。帮助用户按人员维度展示指定时间段内的订单序列,更好的进行数据分析。

栏目说明

Quick BI使用案例」系列短文都来源于用户遇到的真实问题

文章聚焦使用过程中的高频误区与使用技巧,希望能帮助您充分地发挥产品价值。


问题背景

某用户需要在仪表板中展示基于人员维度的指定时间段订单分组排序的序号。例如常见的货物运输场景,需要筛选指定日期范围后,展示各个司机在指定日期范围内累计第1单,第2单,第N单等。


解决方案

方案一. 创建自定义SQL数据集,在明细表中展示订单序号。

Step1. 应用场景数据构建如下(数据源是MySQL 8.0),创建表并插入数据:

CREATE TABLE tbl_sales_info(
order_id INT NOT NULL AUTO_INCREMENT comment '订单编号',
report_date DATETIME comment '订单日期',
driver_name CHAR(40) comment '司机姓名',
order_level CHAR(40) comment '订单等级',
shipping_type CHAR(40) comment '运输方式',
area CHAR(40) comment '区域',
province CHAR(40) comment '省份',
city CHAR(40) comment '城市',
product_type CHAR(40) comment '产品类型',
product_sub_type CHAR(40) comment '产品小类',
product_name CHAR(100) comment '产品名称',
product_box CHAR(40) comment '产品包箱',
shipping_date DATETIME comment '运输日期',
order_number int comment '订单数量',
order_amt float comment '订单金额',
back_point float comment '折扣点',
profit_amt float comment '利润金额',
shipping_cost float comment '运输成本',
payment_date DATETIME comment '付款日期',
PRIMARY KEY(order_id))
ENGINE=InnoDB
DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 1 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 1 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 1 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 6 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 6 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 6 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 11 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 11 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 11 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 31 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 31 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 31 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 36 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 36 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 36 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 65 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 65 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 65 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 74 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 74 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 74 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 78 day),'明哲','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 78 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 78 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 1 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 1 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 1 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 6 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 6 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 6 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 11 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 11 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 11 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 31 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 31 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 31 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 36 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 36 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 36 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 65 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 65 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 65 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 74 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 74 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 74 day));
INSERT INTO tbl_sales_info(report_date,driver_name,order_level,shipping_type,area,province,city,product_type,product_sub_type,product_name,product_box,shipping_date,order_number,order_amt,back_point,profit_amt,shipping_cost,payment_date) VALUES(DATE_SUB(now(), INTERVAL 78 day),'子轩','其他','空运','华东','安徽省','合肥市','办公用品','电脑耗材','赫沃姆','打包纸袋',DATE_SUB(now(), INTERVAL 78 day),FLOOR(RAND()*100),RAND()*100,RAND()*100,RAND()*100-50,RAND()*100,DATE_SUB(now(), INTERVAL 78 day));

插入数据后,表tbl_sales_info中数据如下:

Step2. 创建自定义SQL数据集,在自定义SQL数据集中通过ROW_NUMBER() OVER和值占位符实现。

ROW_NUMBER() OVER 是 MYSQL 中的开窗函数,用于为查询结果集的每一行分配一个唯一的连续序号,常用于分组排序、数据去重和分页等场景。其核心语法为:

ROW_NUMBER() OVER (PARTITION BY 分组列 ORDER BY 排序列)

其中 ‌PARTITION BY 用于分组,ORDER BY 用于组内排序‌,若省略 PARTITION BY 则对整个结果集排序。‌‌

Quick BI中值占位符可通过仪表板上的查询控件传入日期范围,进行筛选。当占位符是日期时,需要选择具体的日期格式,来控制传入值的格式。

占位符具体格式如下:

'$val{占位符名}'

通过ROW_NUMBER() OVER和值占位符实现的完整SQL代码如下:

SELECT order_id,report_date,driver_name,profit_amt,order_amt,ROW_NUMBER() OVER(PARTITION by driver_name ORDER BY report_date ASC) RN
from (select * from tbl_sales_info WHERE report_date > '$val{report_date_ph.get(0)}' AND report_date < '$val{report_date_ph.get(1)}') b

其中ROW_NUMBER() OVER中根据driver_name分组,根据report_date进行排序。占位符变量名是report_date_ph,其中'$val{report_date_ph.get(0)}' 表示获取日期范围查询控件起始日期,'$val{report_date_ph.get(1)}'表示 获取日期范围控件结束日期。占位符具体设置如下:

Step3. 仪表板中创建明细表,字段配置如下:

查询控件配置如下:

Step4. 在明细表中展示效果如下:

查询10月的订单,RN列显示该订单是对应司机在10月份按照时序排列的订单序号(从1开始),如下图所示:

查询11月的订单,RN列显示该订单是对应司机在11月份按照时序排列的订单序号(从1开始),如下图所示:

方案二. 通过物理表建数据集,在交叉表展示订单序号。

Step1.利用方案一中创建的物理表tbl_sales_info建数据集tbl_sales_info。

Step2.交叉表中添加计算字段RN,具体如下图:

Step3.交叉表字段配置如下:

Step4.对字段RN设置“高级计算-累计计算-自定义”,如下图:

累计计算类型选择“按列组内累计”,分组维度选择“司机姓名”,如下图:

Step5.对字段RN设置“排序-高级排序”,在高级排序中选择“司机姓名”升序排列,订单日期(ymdhms)组内升序排列,如下图:

Step6. 在交叉表中展示效果如下,查询2025年9月的订单,RN列显示该订单是对应司机在9月份按照时序排列的订单序号(从1开始),如下图所示:

查询2025年10月的订单,RN列显示该订单是对应司机在10月份按照时序排列的订单序号(从1开始),如下图所示:


如阅读后有任何问题,您可以点击Quick BI产品内右下角【帮助与反馈】按钮与我们取得联系。

相关文章
|
3月前
|
SQL BI Serverless
Quick BI使用案例01:巧用lod函数和加速引擎解决跨维度占比计算,从3分钟到0.9秒快速查数
「Quick BI使用案例」系列基于真实问题,聚焦高频误区与实用技巧。本文详解如何用LOD函数计算分组占比,并通过加速配置将140万行数据查询从超时优化至0.9秒,提升性能。
|
2月前
|
BI
Quick BI使用案例04:一图多看:实现同一图表时间粒度(年/月/日)自由切换
本文详解如何通过查询控件联动和维度组功能,实现图表内年、月、日时间粒度的动态切换,提升分析效率与仪表板可用性。
|
2月前
|
数据可视化 BI
Quick BI使用案例03:让仪表板中表格列标题“各显其色”:自定义每列的表头颜色
在 Quick BI 交叉表和明细表中,所有列的表头仅支持设置统一的背景颜色。然而在实际报表开发中,常需要在仪表板中通过差异化表头样式来直观区分不同维度或指标列(例如:关键指标高亮、分类字段着色等),以提升可读性与分析效率。 本文将介绍一种在 Quick BI 仪表板中实现表格各列表头独立配色的实用方案,帮助您打造更清晰、更专业的可视化报表。
|
10天前
|
关系型数据库 MySQL BI
Quick BI使用案例09:柱图中用颜色直观区分各区域订单数量区间
本文以区域订单数智能分段打标为例,通过lod_fixed函数创建计算字段,实现柱图按数量区间(如“1500以下”“1500–2500”)自动着色,直观呈现数据分布,助力高效洞察。
|
28天前
|
供应链 数据可视化 前端开发
Quick BI使用案例07:点击文字按钮,实现“点击即洞察”的带参数跳转
本文详解如何用“指标看板+空值字段+跳转”组合,模拟文字按钮实现参数化跳转,无需开发、不增图表,即可打造可操作的分析闭环,提升用户体验与分析效率。
|
自然语言处理 监控 数据可视化
告别“数据焦虑”——详解Quick BI 移动端6大使用场景
Quick BI移动端微应用集成钉钉、企业微信、飞书,支持实时数据查看、智能问数、库存填报、协同DING、告警订阅等功能,助力企业实现“千人千面”数据决策,让数据真正走进业务场景。
告别“数据焦虑”——详解Quick BI 移动端6大使用场景
|
3月前
|
存储 SQL 运维
数据湖 vs 数据仓库 vs 数据湖仓一体:何时选哪种架构?——写给正在做数据平台的你
数据湖 vs 数据仓库 vs 数据湖仓一体:何时选哪种架构?——写给正在做数据平台的你
188 12
|
20天前
|
SQL 数据可视化 BI
Quick BI使用案例08: 灵活对比任意两个日期区间的区域订单金额变化
本文介绍如何在Quick BI中通过自定义SQL与占位符参数,实现双时段订单金额对比分析。支持用户灵活选择日期区间,实时计算区域维度的比值并可视化展示,助力高效决策。
|
3月前
|
SQL 人工智能 数据挖掘
Quick BI V6.0发布:让人人都能拥有的「超级数据分析师」到底强在哪?
阿里巴巴发布首个数据分析Agent“智能小Q”,集成问数、解读、报告生成与报表搭建能力,基于AI实现一句话获取数据洞察。Quick BI 6.0深度融合AI与BI,升级多源数据接入、自动化分析与协同办公,让企业人人拥有“超级数据分析师”。
|
29天前
|
BI 数据安全/隐私保护
Quick BI使用案例06: 一企多端,权限无忧:移动端微应用实现钉钉、企微数据隔离
本文详解如何在钉钉与企业微信多平台并行时,通过“收藏管理”或“数据门户”实现移动端微应用的部门级数据隔离,确保财务等敏感信息仅对授权人员可见,提升数据安全与使用效率。