一、前言

在校园考勤管理中,人工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 关联考勤记录与考勤类型
  1. 添加“排序记录”组件,按attendance_type_idattendance_task_order_id排序
  2. 添加“记录集连接”组件,配置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 核心收获

通过本次实验,我们完成了以下工作:

  1. 完整的ETL流程搭建:从数据接入、多表关联、标签衍生到聚合统计和结果落地
  2. 星型模型实践:构建了“事实表+维度表+属性表”的数据模型
  3. 业务标签体系设计:实现了基础属性、画像维度、行为指标三类标签
  4. 空值与异常处理:建立了完整的空值替换和数据标准化机制

5.2 业务价值

  • 替代人工Excel统计,效率提升90%以上
  • 固化统计口径,确保数据一致性
  • 沉淀标准化数据台账,支撑数据分析与决策
  • 灵活可扩展,支持新增考勤类型

5.3 扩展方向

  • 接入成绩表、消费表,构建更全面的学生画像
  • 增加时间维度(周/月/学期)的聚合统计
  • 配置调度任务,实现自动化每日更新
  • 对接BI可视化工具,搭建考勤数据看板

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐