学生多维度考勤统计ETL转换流实战:从零搭建学生考勤标签体系
一、前言
在校园考勤管理中,人工Excel统计面临着效率低、口径不统一、数据分散等诸多痛点。本文基于“数智教育”大赛数据集,使用助睿数智(Uniplore)一站式数据科学平台,从零搭建一个完整的ETL转换流,实现学生考勤数据的自动化处理与多维度标签构建。
通过本文,你将学会:
- ETL全流程配置(数据接入、关联、衍生、聚合、落地)
- 多表关联与星型模型构建
- 考勤行为标签的衍生逻辑
- 多维度聚合统计方法
二、实验背景
2.1 实验目的
基于“数智教育”大赛数据集,设计并实现学生多维度考勤统计ETL转换流,解决校园考勤人工统计效率低、口径不统一的问题,输出精准的多维度考勤统计结果。
2.2 实验环境
- 工具:助睿数智(Uniplore)零代码在线实验平台
- 访问地址:https://lab.guilian.cn/
- 产品官网:https://www.uniplore.com/
- 数据源:“数智教育”大赛数据集(7张核心业务表)
2.3 核心数据表说明
本次实验聚焦考勤主题,主要使用以下三张表:
| 数据源表 | 核心作用 | 关键字段 |
|---|---|---|
| 考勤主表(3_kaoqin) | 存储学生每日原始打卡记录 | 学生ID、班级ID、打卡时间、考勤类型ID |
| 考勤类型码表(4_kaoqintype) | 标准化考勤事件名称 | 考勤类型ID、考勤事件名称 |
| 学生信息表(2_student_info) | 提供学生基础属性 | 学生ID、班级ID、姓名、性别、是否住校 |
这三张表形成了**“事实表 + 维度表 + 属性表”** 的完整星型模型结构。
三、转换流整体设计
3.1 核心处理逻辑
数据接入 → 多表关联 → 行为标签标记 → 指标计算 → 属性关联 → 结果落地
3.2 标签体系设计
3.2.1 学生基础属性标签
| 标签字段 | 数据来源 | 说明 |
|---|---|---|
| 学生ID | 考勤主表/学生信息表 | 唯一标识 |
| 学生姓名 | 考勤主表/学生信息表 | 便于查阅 |
| 班级ID | 考勤主表/学生信息表 | 班级维度统计 |
| 性别 | 学生信息表 | 性别维度分析 |
3.2.2 学生画像维度标签
| 标签字段 | 衍生逻辑 | 说明 |
|---|---|---|
| 年级 | 从班级名称提取 | 高一/高二/高三 |
| 是否住校 | 映射bf_zhusu字段 | 1→是,0→否 |
| 校区类型 | 从班级名称判断 | 新校区/老校区 |
3.2.3 考勤行为统计标签
| 标签字段 | 统计口径 |
|---|---|
| 迟到次数 | 考勤事件名称包含“迟到”“晚到”,排除请假 |
| 早退次数 | 考勤事件名称包含“早退”,排除请假 |
| 请假次数 | 考勤事件名称包含“请假” |
| 没穿校服次数 | 考勤事件名称包含“校服” |
四、实验步骤
4.1 创建实验项目
首先登录助睿零代码在线实验平台,点击“新建项目”,输入项目名称“学生用户画像标签构建”。

创建成功后,即可在数据集成页面看到新创建的项目。
4.2 数据资源获取
4.2.1 获取实验数据集
点击项目右上角“…” → “打开项目”,进入项目页面。
在文件库中新建目录“数智教育数据集”,然后将公共空间中的以下CSV文件导出到该目录:
3_kaoqin.csv(考勤主表)4_kaoqintype.csv(考勤类型码表)2_student_info.csv(学生信息表)






4.2.2 建立数据源连接
在元数据管理页面,右键“关系数据库” → “新建数据源”,配置MySQL连接信息:
| 配置项 | 值 |
|---|---|
| 连接类型 | MySQL |
| 驱动类型 | MySQL 8+ |
| 服务器主机名 | rm-2vc3qok06bag39a5n.mysql.cn-chengdu.rds.aliyuncs.com |
| 端口号 | 3306 |


点击“测试”验证连接成功后,点击“添加”完成数据源创建。
4.2.3 导入原始数据到数据库
(1)创建原始_学生考勤表
新建转换流“创建原始_学生考勤表”,拖拽“执行一个SQL脚本”组件,执行建表SQL:
CREATE TABLE IF NOT EXISTS `raw_attendance` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`attendance_id` varchar(64) DEFAULT NULL COMMENT '考勤ID',
`learn_term` varchar(30) DEFAULT NULL COMMENT '学期',
`data_datetime` varchar(50) DEFAULT NULL COMMENT '时间和日期',
`attendance_type_id` varchar(64) DEFAULT NULL COMMENT '考勤类型ID',
`attendance_name` varchar(100) DEFAULT NULL COMMENT '考勤名称',
`stu_id` varchar(64) DEFAULT NULL COMMENT '学生ID',
`stu_name` varchar(100) DEFAULT NULL COMMENT '学生姓名',
`cla_name` varchar(100) DEFAULT NULL COMMENT '班级名',
`cla_id` varchar(64) DEFAULT NULL COMMENT '班级ID',
PRIMARY KEY (`id`)
) COMMENT='原始_学生考勤表';


(2)导入原始考勤数据
新建转换流“导入原始考勤数据”,配置如下组件:
CSV文件输入组件配置:
- 文件名:选择
3_kaoqin.csv - 列分隔符:默认
- 编码:UTF-8



表输出组件配置:
- 数据库连接:团队私有数据库
- 目标表:
raw_attendance - 建立字段映射关系




(3)导入考勤类型表
参照上述步骤,创建raw_attendance_type表并导入4_kaoqintype.csv数据。
特别说明:考勤类型表的CSV列分隔符为制表符(TAB),编码为GB2312。
CREATE TABLE IF NOT EXISTS `raw_attendance_type` (
`id` bigint NOT NULL AUTO_INCREMENT,
`attendance_type_id` varchar(64) NOT NULL,
`attendance_type_name` varchar(100) DEFAULT NULL,
`attendance_task_order_id` varchar(64) DEFAULT NULL,
`attendance_task_name` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) COMMENT='原始_考勤类型表';



表输出组件的配置与原始考勤记录表数据导入的一样
(4)导入学生信息表
创建raw_student_info表并导入2_student_info.csv数据。
CREATE TABLE IF NOT EXISTS `raw_student_info` (
`id` bigint NOT NULL AUTO_INCREMENT,
`stu_id` varchar(64) NOT NULL COMMENT '学生ID',
`stu_name` varchar(100) DEFAULT NULL,
`stu_sex` varchar(10) DEFAULT NULL,
`born_date` varchar(10) DEFAULT NULL,
`cla_name` varchar(100) DEFAULT NULL,
`policy` varchar(50) DEFAULT NULL,
`cla_id` varchar(64) DEFAULT NULL,
`live_on_campus` varchar(10) DEFAULT NULL COMMENT '是否住校',
PRIMARY KEY (`id`)
) COMMENT='原始_学生信息表';



特别说明:bf_zhusu、bf_qinshihao 这2个字段是Integer,为避免出现小数,需要使用“字段选择”组件来固化并规范
拖拽“字段选择”组件到画布中,创建“CSV文件输入”组件到“字段选择”组件的连线,连接线类型选择“主输出步骤”





4.2.4 创建目标标签表
新建转换流“创建学生考勤主题标签表”,执行建表SQL:
CREATE TABLE IF NOT EXISTS student_attendance_stats (
id INT PRIMARY KEY AUTO_INCREMENT,
student_id INT NOT NULL COMMENT '学生ID',
student_name VARCHAR(50) NOT NULL COMMENT '学生姓名',
class_id INT NOT NULL COMMENT '班级ID',
class_name VARCHAR(50) NOT NULL COMMENT '班级名称',
grade VARCHAR(10) NOT NULL COMMENT '年级',
gender VARCHAR(10) NOT NULL COMMENT '性别',
birth_date VARCHAR(10) NOT NULL COMMENT '出生日期',
political_status VARCHAR(20) NOT NULL COMMENT '政治面貌',
is_boarder VARCHAR(10) NOT NULL COMMENT '是否住校',
campus_type VARCHAR(10) NOT NULL COMMENT '校区类型',
late_count INT NOT NULL DEFAULT 0 COMMENT '迟到次数',
early_leave_count INT NOT NULL DEFAULT 0 COMMENT '早退次数',
leave_count INT NOT NULL DEFAULT 0 COMMENT '请假次数',
uniform_violate_count INT NOT NULL DEFAULT 0 COMMENT '没穿校服次数',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) COMMENT='学生考勤主题标签表';

4.3 核心ETL转换流构建
4.3.1 整体流程架构
新建转换流“学生考勤主题标签”,整体流程如下:
考勤记录表输入 ──→ 排序 ──→ 记录集连接 ──→ JavaScript脚本(行为标记) ──→ 分组聚合 ──→ 排序 ──→ 记录集连接 ──→ 字段选择 ──→ 空值替换 ──→ 值映射(住校) ──→ JavaScript脚本(年级/校区) ──→ 表输出
↑
考勤类型表输入 ──────┘
学生信息表输入 ──→ 排序 ──┘
📸 图片位置:完整转换流画布截图
4.3.2 数据接入
拖拽3个“表输入”组件到画布,分别配置:
考勤记录表输入:
- 步骤名称:考勤记录
- SQL:
SELECT * FROM raw_attendance
考勤类型表输入:
- 步骤名称:考勤类型
- SQL:
SELECT * FROM raw_attendance_type
学生信息表输入:
- 步骤名称:学生信息
- SQL:
SELECT * FROM raw_student_info

双击第一个表输入组件,在配置窗口中,步骤名称修改为“考勤记录”,数据库连接选择“团队私有数据库”,并点击“获取SQL查询语句”

同样的,参考以上步骤,将“表输入 1”和“表输入 2”组件分别命名为“考勤类型”和“学生信息”,分别获取“raw_attendance_type”考原始_考勤类型表和“raw_student_info”原始_学生信息表所有字段数据
4.3.3 关联考勤记录与考勤类型
- 添加“排序记录”组件,按
attendance_type_id和attendance_task_order_id排序 - 添加“记录集连接”组件,配置LEFT OUTER JOIN关联

为避免因为排序问题造成连接结果出错。添加一个排序记录组件到转换流的“考勤记录”与“记录集连接”之间。
双击“排序记录”组件,通过“获取字段”功能获取字段列表,然后删除多余字段,只保留“attendance_type_id”、“attendance_task_order_id”字段。因为下一步连接是使用这两个字段进行连接,所以采用这两个字段对记录进行排序。最后设置步骤名称为“按照考勤类型和考勤任务类型排序”

创建“考勤类型”表输入组件到记录集连接组件的连接线。由于“考勤类型”组件的记录默认是按“attendance_type_id”、“attendance_task_order_id”这两个字段升序记录的,所以无需再次排序。
需要通过记录集连接组件来配置“考勤记录”和“考勤类型”两个表的关联关系。双击记录集连接组件,在下拉列表中选择需要连接的数据来源,第一个Transform选择“按照考勤类型和考勤任务类型排序”,第二个Transform选择“考勤类型”,连接类型选择LEFT OUTER
第2个Transform字段中仅保留“attendance_type_id”、“attendance_task_order_id”字段,这样做表示使用这2个字段进行记录连接。可以使用“删除选中的行”批量删除多个字段。
4.3.4 行为标签衍生(JavaScript脚本)
添加“JavaScript代码”组件,输入以下脚本:
// 初始化变量
var isLate = 0;
var isEarly = 0;
var isLeave = 0;
var isNoUniform = 0;
// 迟到/早退判断(排除请假)
if(attendance_type_name != null && attendance_task_name != null){
if((attendance_type_name.includes("迟到") ||
attendance_type_name.includes("晚到") ||
attendance_task_name.includes("迟到") ||
attendance_task_name.includes("晚到")) &&
!attendance_task_name.includes("请假")){
isLate = 1;
}
if((attendance_type_name.includes("早退") ||
attendance_task_name.includes("早退")) &&
!attendance_task_name.includes("请假")){
isEarly = 1;
}
// 校服违规判断
if(attendance_type_name.includes("校服") ||
attendance_task_name.includes("校服")){
isNoUniform = 1;
}
}
// 请假判断
if(attendance_task_name != null){
if(attendance_task_name.includes("请假")){
isLeave = 1;
}
}
点击“JavaScript脚本”组件的“测试脚本”按钮,确认标记字段(is_late_early、is_leave等)仅存在1和0两个值,标签判断准确(如迟到记录对应is_late_early=1,正常出勤对应is_compliant=1),无异常。
4.3.5 多维度分组聚合
添加“分组”组件,配置如下:
分组字段:
- stu_id、stu_name、cla_id、cla_name
聚合字段:
| 聚合字段 | 聚合函数 | 说明 |
|---|---|---|
| late_count | SUM(isLate) | 迟到次数 |
| early_count | SUM(isEarly) | 早退次数 |
| leave_count | SUM(isLeave) | 请假次数 |
| uniform_count | SUM(isNoUniform) | 没穿校服次数 |
4.3.6 关联学生信息
基于上述结果,使用记录集连接组件,关联学生信息表——因为考勤记录表仅包含学生ID和班级ID,缺少学生是否住校的核心属性,通过按学生ID关联学生信息表,可补全该属性,支撑住校相关维度的统计。具体操作如下:
由于“学生信息”数据表中的学号不是升序记录的,所以在进行记录关联前,也需要对数据进行排序。再次添加“排序记录”,并建立“学生信息”表输入组件到“排序记录”组件的连接线
由于考勤记录数据不是按“学号”升序记录的,所以在进行记录关联前,也需要对数据进行排序。再次添加“排序记录”,并建立“记录集连接”组件到“排序记录”组件的连接线
双击“排序记录”组件,按下图进行配置,步骤名称设置为“考勤数据按学号排序”,排序字段为“stu_id”

创建“考勤数据按学号排序”记录排序组件到记录集连接 1组件的连线,关联学生信息和考勤记录信息

记录集连接 组件的第一个Transform选择“考勤数据按学号排序”,第二个Transform选择“按照学生编号进行排序”,连接类型选择LEFT OUTER
点击第一个Transform的连接字段中的“获得连接字段”按钮,即可获取考勤记录和考勤类型关联后的字段。同样的,获取第二个Transform的连接字段。第一个Transform字段保留“stu_id”,第二个Transform字段保留“stu_id”。连接类型选择LEFT OUTER,表示使用考勤记录的字段 stu_id与学生信息的字段 stu_id进行左外连接。
4.3.7 字段选择与冗余移除
添加“字段选择”组件,移除冗余字段,保留核心字段:
- stu_id、stu_name、cla_id、cla_name
- late_count、early_count、leave_count、uniform_count
- stu_sex、born_date、policy、live_on_campus
4.3.8 空值处理
添加“替换NULL值”组件,将空值替换为“未知”:
- stu_sex → 未知
- born_date → 未知
- policy → 未知
- live_on_campus → 未知
4.3.9 基础属性标准化
住校状态映射
添加“值映射”组件:使用的字段名为“live_on_campus”,不匹配时的默认值为“否”
| 源值 | 目标值 |
|---|---|
| 0 | 否 |
| 1 | 是 |
| NULL | 否 |
从班级名提取年级
添加“JavaScript代码”组件:
var gra_name;
if (cla_name == null){
gra_name = '未知';
}else if(cla_name.includes('高一')){
gra_name = '高一';
}else if(cla_name.includes('高二')){
gra_name = '高二';
}else if(cla_name.includes("高三")){
gra_name = '高三';
}else{
gra_name = '未知';
}
接下需要设置“gra_name”字段类型,在配置窗口的下方空白表格处右键,点击“插入”
字段名称输入“gra_name”,类型为“String”,替换“字段名”或“重命名”值选择“否”,设置完成后点击“确认”
校区类型判定
添加“JavaScript代码”组件:
var class_campus_type;
if (cla_name == null){
class_campus_type = '未知';
}else if(cla_name.startsWith('白-') || cla_name.startsWith('东-')){
class_campus_type = '新校区';
}else if (cla_name != null && !isEmpty(cla_name)){
class_campus_type = '老校区';
}else{
class_campus_type = '未知';
}
字段名称“class_campus_type”,类型为“String”,替换“字段名”或“重命名”值选择“否”
4.3.10 结果入库
添加“表输出”组件:
- 数据库连接:团队私有数据库
- 目标表:student_attendance_stats
- 勾选“裁剪表”(清空原有数据)
- 建立字段映射关系
4.4 执行工作流
点击工具栏“执行”按钮,选择默认配置后启动。
4.5 验证结果
查看数据库结果
打开“元数据”tab页,在“团队私有数据库”连接上右键选择“加载元数据”
在元数据管理页面,双击目标表student_attendance_stats,查看数据是否符合预期。

五、总结
5.1 核心收获
通过本次实验,我们完成了以下工作:
- 完整的ETL流程搭建:从数据接入、多表关联、标签衍生到聚合统计和结果落地
- 星型模型实践:构建了“事实表+维度表+属性表”的数据模型
- 业务标签体系设计:实现了基础属性、画像维度、行为指标三类标签
- 空值与异常处理:建立了完整的空值替换和数据标准化机制
5.2 业务价值
- 替代人工Excel统计,效率提升90%以上
- 固化统计口径,确保数据一致性
- 沉淀标准化数据台账,支撑数据分析与决策
- 灵活可扩展,支持新增考勤类型
5.3 扩展方向
- 接入成绩表、消费表,构建更全面的学生画像
- 增加时间维度(周/月/学期)的聚合统计
- 配置调度任务,实现自动化每日更新
- 对接BI可视化工具,搭建考勤数据看板
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)