You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于统计同一员工不同行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_idemployee_Nbrprev_begin_dtmatch_datenext_shift_idnext_begin_dtnext_end_dt
001122021-01-072021-01-090022021-01-092021-01-14
003152021-01-102021-01-130052021-01-132021-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:47:47