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产品内右下角【帮助与反馈】按钮与我们取得联系。

相关文章
|
2月前
|
关系型数据库 MySQL BI
Quick BI使用案例09:柱图中用颜色直观区分各区域订单数量区间
本文以区域订单数智能分段打标为例,通过lod_fixed函数创建计算字段,实现柱图按数量区间(如“1500以下”“1500–2500”)自动着色,直观呈现数据分布,助力高效洞察。
|
2月前
|
BI 数据安全/隐私保护
Quick BI使用案例06: 一企多端,权限无忧:移动端微应用实现钉钉、企微数据隔离
本文详解如何在钉钉与企业微信多平台并行时,通过“收藏管理”或“数据门户”实现移动端微应用的部门级数据隔离,确保财务等敏感信息仅对授权人员可见,提升数据安全与使用效率。
|
2月前
|
供应链 数据可视化 前端开发
Quick BI使用案例07:点击文字按钮,实现“点击即洞察”的带参数跳转
本文详解如何用“指标看板+空值字段+跳转”组合,模拟文字按钮实现参数化跳转,无需开发、不增图表,即可打造可操作的分析闭环,提升用户体验与分析效率。
|
3月前
|
SQL 移动开发 关系型数据库
Quick BI使用案例02:基于人员维度的指定时间段订单分组排序
本文介绍Quick BI基于人员维度的指定时间段内订单分组排序的两种方案:通过使用占位符和ROW_NUMBER()函数建自定义SQL数据集,在明细表中实现。或者通过物理表建数据集,在交叉表中利用计算字段与累计计算实现。帮助用户按人员维度展示指定时间段内的订单序列,更好的进行数据分析。
|
15天前
|
SQL 供应链 监控
Quick BI使用案例12:如何实现分组内“最新”与“次新”订单时间计算
本文详解订单时效性分析:通过LOD_FIXED与BI_MAX函数,快速计算各区域“最新/次新订单时间”,助力识别交易活跃度、预警客户流失、优化供应链。
|
1月前
|
BI 数据安全/隐私保护 开发者
Quick BI使用案例11:基于钉钉组织架构,按角色精准同步“店长”账号至 Quick BI
本案例针对连锁足疗品牌Quick BI账号泛滥问题,提供钉钉组织同步精准管控方案:通过钉钉开发者后台配置应用“可见范围”,仅同步店长等必要角色,避免席位浪费与权限混乱,提升管理效率。(239字)
|
3月前
|
BI
Quick BI使用案例04:一图多看:实现同一图表时间粒度(年/月/日)自由切换
本文详解如何通过查询控件联动和维度组功能,实现图表内年、月、日时间粒度的动态切换,提升分析效率与仪表板可用性。
|
2月前
|
SQL 数据可视化 BI
Quick BI使用案例08: 灵活对比任意两个日期区间的区域订单金额变化
本文介绍如何在Quick BI中通过自定义SQL与占位符参数,实现双时段订单金额对比分析。支持用户灵活选择日期区间,实时计算区域维度的比值并可视化展示,助力高效决策。
|
3月前
|
SQL 人工智能 自然语言处理
干货收藏|深度解析数据分析Agent技术原理与产品发展
《2025数据分析Agent白皮书》内容聚焦数据分析Agent的技术路线、落地方案与未来方向,希望能将Quick BI团队多年积累的思考传递给所有关心数据领域技术和应用发展的用户。
|
4月前
|
SQL BI Serverless
Quick BI使用案例01:巧用lod函数和加速引擎解决跨维度占比计算,从3分钟到0.9秒快速查数
「Quick BI使用案例」系列基于真实问题,聚焦高频误区与实用技巧。本文详解如何用LOD函数计算分组占比,并通过加速配置将140万行数据查询从超时优化至0.9秒,提升性能。

热门文章

最新文章