关于统计同一员工不同行end_dt与begin_dt匹配次数及生成关联数据表的技术咨询
解决方案:匹配同一员工的连续班次并统计次数
首先,我们可以通过**自连接(Self-Join)**的方式来实现这个需求,既可以生成包含匹配关联信息的结果表,也能基于这个结果统计总匹配次数。
1. 示例数据准备
先把你提供的示例数据创建成测试表(适配大多数关系型数据库的SQL写法):
CREATE TABLE employee_shifts ( shift_id VARCHAR(3), employee_Nbr INT, begin_dt DATE, end_dt DATE ); INSERT INTO employee_shifts VALUES ('001', 12, '2021-01-07', '2021-01-09'), ('002', 12, '2021-01-09', '2021-01-14'), ('003', 15, '2021-01-10', '2021-01-13'), ('004', 12, '2021-01-24', '2021-01-24'), ('005', 15, '2021-01-13', '2021-01-14');
2. 查询匹配的关联信息
使用自连接关联同一个员工的不同班次,筛选出前一班结束日期等于后一班开始日期的记录:
SELECT a.shift_id AS prev_shift_id, a.employee_Nbr, a.begin_dt AS prev_begin_dt, a.end_dt AS match_date, -- 用于匹配的衔接日期 b.shift_id AS next_shift_id, b.begin_dt AS next_begin_dt, b.end_dt AS next_end_dt FROM employee_shifts a JOIN employee_shifts b ON a.employee_Nbr = b.employee_Nbr AND a.end_dt = b.begin_dt AND a.shift_id != b.shift_id; -- 排除同一条记录的自匹配
执行结果:
| prev_shift_id | employee_Nbr | prev_begin_dt | match_date | next_shift_id | next_begin_dt | next_end_dt |
|---|---|---|---|---|---|---|
| 001 | 12 | 2021-01-07 | 2021-01-09 | 002 | 2021-01-09 | 2021-01-14 |
| 003 | 15 | 2021-01-10 | 2021-01-13 | 005 | 2021-01-13 | 2021-01-14 |
这个结果清晰展示了所有符合条件的班次关联关系,完全满足你需要的匹配关联信息数据表的要求。
3. 统计总匹配次数
如果需要统计总次数,只需要在上述查询基础上使用COUNT(*)即可:
SELECT COUNT(*) AS total_matches FROM employee_shifts a JOIN employee_shifts b ON a.employee_Nbr = b.employee_Nbr AND a.end_dt = b.begin_dt AND a.shift_id != b.shift_id;
执行结果:
| total_matches |
|---|
| 2 |
关键说明
a.shift_id != b.shift_id这个条件专门排除了单条记录中begin_dt和end_dt相等的自匹配情况(比如示例中的shift_id 004)- 自连接的核心逻辑确保只关联同一个员工的班次,且前后班次的日期完全衔接
- 这个方案适配MySQL、PostgreSQL、SQL Server等主流关系型数据库,若你的数据库对日期格式有特殊要求,只需调整
INSERT语句中的日期格式即可
内容的提问来源于stack exchange,提问作者Michael Ancel
相关产品推荐
相关产品推荐

