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

SQL Server如何按员工分组,将最早日期ID放A列其余放B列?

实现思路与SQL写法

嘿,针对你这个把员工最早日期对应的ID放到A列、其余ID放到B列的需求,咱们用窗口函数+条件聚合的组合就能轻松搞定,下面给你具体拆解:

核心思路

  1. 先给每个员工的记录按日期排序,标记出最早的那一条:用ROW_NUMBER()窗口函数,按员工分组、日期升序排序,最早的记录会被标记为1;
  2. 再通过条件聚合,把标记为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(...)
  • 这个写法会把该员工所有非最早日期的ID用逗号分隔放到B列,完全匹配你给出的输出格式要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:58:34