SQL Server如何按员工分组,将最早日期ID放A列其余放B列?
实现思路与SQL写法
嘿,针对你这个把员工最早日期对应的ID放到A列、其余ID放到B列的需求,咱们用窗口函数+条件聚合的组合就能轻松搞定,下面给你具体拆解:
核心思路
- 先给每个员工的记录按日期排序,标记出最早的那一条:用
ROW_NUMBER()窗口函数,按员工分组、日期升序排序,最早的记录会被标记为1; - 再通过条件聚合,把标记为1的ID提取到A列,把标记不为1的ID合并到B列。
具体SQL代码
通用版本(适配多数支持窗口函数的数据库)
WITH ranked_records AS ( SELECT employee_id, id, record_date, -- 按员工分组,日期升序排序,最早的记录标记为1 ROW_NUMBER() OVER (PARTITION BY employee_id ORDER BY record_date ASC) AS rn FROM your_table_name -- 可以先过滤目标员工,也可以去掉这句处理所有员工 WHERE employee_id = '25FC0938-88EE' ) SELECT employee_id, -- 提取最早日期对应的ID到A列 MAX(CASE WHEN rn = 1 THEN id END) AS column_a, -- 把其余ID合并到B列,不同数据库拼接函数有差异,下面是常见几种: -- MySQL/MariaDB用GROUP_CONCAT -- GROUP_CONCAT(CASE WHEN rn != 1 THEN id END SEPARATOR ', ') AS column_b, -- PostgreSQL用STRING_AGG STRING_AGG(CASE WHEN rn != 1 THEN id END, ', ') AS column_b, -- SQL Server用STRING_AGG -- STRING_AGG(CASE WHEN rn != 1 THEN id END, ', ') AS column_b FROM ranked_records GROUP BY employee_id;
补充说明
- 如果你需要处理所有员工,去掉CTE里的
WHERE条件即可,每个员工的记录都会按规则生成A、B列; - 字符串拼接函数需要根据你使用的数据库调整:
- MySQL/MariaDB:
GROUP_CONCAT(...) - PostgreSQL:
STRING_AGG(...) - SQL Server 2017及以上:
STRING_AGG(...)
- MySQL/MariaDB:
- 这个写法会把该员工所有非最早日期的ID用逗号分隔放到B列,完全匹配你给出的输出格式要求。
内容的提问来源于stack exchange,提问作者Satyakam
相关产品推荐
相关产品推荐

