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

如何为每个人员编号筛选最早创建的数据库记录?

实现方案:为每个人员编号筛选最早创建的记录

需求核心

按**app + NoPerson**组合分组(不同应用下的同一人员编号视为独立个体),筛选出每组中CreationDateTime(创建时间)最小的完整记录,无需考虑Status(活跃/历史)标识。


通用方案:窗口函数(推荐)

适用于MySQL 8.0+、PostgreSQL、SQL Server、Oracle等绝大多数现代数据库,逻辑清晰且性能优异:

SELECT app, NoPerson, Status, Name, CreationDateTime
FROM (
    SELECT 
        *,
        -- 按app+NoPerson分组,组内按创建时间升序编号,最早的记录编号为1
        ROW_NUMBER() OVER (PARTITION BY app, NoPerson ORDER BY CreationDateTime ASC) AS record_rank
    FROM your_table_name -- 替换为你的实际表名
) ranked_records
WHERE record_rank = 1;

兼容旧版数据库:关联子查询

如果使用不支持窗口函数的旧版数据库(如MySQL 5.x),可以用此方法:

SELECT t1.*
FROM your_table_name t1
INNER JOIN (
    -- 先计算每个app+NoPerson组的最小创建时间
    SELECT app, NoPerson, MIN(CreationDateTime) AS earliest_create_time
    FROM your_table_name
    GROUP BY app, NoPerson
) t2 
ON t1.app = t2.app 
AND t1.NoPerson = t2.NoPerson 
AND t1.CreationDateTime = t2.earliest_create_time;

MySQL特定简化方案:EXISTS子查询

利用NOT EXISTS直接筛选无更早记录的条目:

SELECT t1.*
FROM your_table_name t1
WHERE NOT EXISTS (
    SELECT 1
    FROM your_table_name t2
    WHERE t2.app = t1.app 
      AND t2.NoPerson = t1.NoPerson 
      AND t2.CreationDateTime < t1.CreationDateTime
);

结果验证

以上三种方案均能从你提供的原始数据中得到期望结果:

appNoPersonStatusNameCreationDateTime
110Ali2022-08-30 11:31:53.117
121Charly2022-09-30 17:18:22.147
211Andy2022-11-20 19:19:13.353
220Alann2022-10-13 10:28:23.910
231Marc2022-10-14 11:35:23.910

内容的提问来源于stack exchange,提问作者Carlos Zaiyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:25:16