如何为每个人员编号筛选最早创建的数据库记录?
实现方案:为每个人员编号筛选最早创建的记录
需求核心
按**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 );
结果验证
以上三种方案均能从你提供的原始数据中得到期望结果:
| app | NoPerson | Status | Name | CreationDateTime |
|---|---|---|---|---|
| 1 | 1 | 0 | Ali | 2022-08-30 11:31:53.117 |
| 1 | 2 | 1 | Charly | 2022-09-30 17:18:22.147 |
| 2 | 1 | 1 | Andy | 2022-11-20 19:19:13.353 |
| 2 | 2 | 0 | Alann | 2022-10-13 10:28:23.910 |
| 2 | 3 | 1 | Marc | 2022-10-14 11:35:23.910 |
内容的提问来源于stack exchange,提问作者Carlos Zaiyan
相关产品推荐
相关产品推荐

