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

按Issue和Client合并Label列多行值的Pandas及SQL实现方案咨询

实现方案

Pandas 实现

你之前的代码仅指定了Label列的聚合逻辑,因此返回结果只有三列。要保留其余列,只需为剩余非分组列统一指定聚合规则为first(取分组内第一行值)即可。
如果列数较少可直接手动指定聚合规则:

result_df = df.groupby(
    ['Issue', 'Client'],
    as_index=False,
    sort=False # 保留原始数据的行顺序
).agg({
    'Label': ','.join,
    'Subject': 'first',
    'type': 'first',
    'Team': 'first',
    'Subteam': 'first',
    'Priority': 'first',
    'CreatedOn': 'first',
    'BuiltOn': 'first',
    'CreatedBy': 'first',
    'Status': 'first'
})

如果列数较多不想逐个书写,可通过字典推导式批量生成聚合规则:

# 定义需要特殊处理的列
special_agg = {'Label': ','.join}
# 剩余非分组列统一取分组首行值
normal_agg = {
    col: 'first' 
    for col in df.columns 
    if col not in ['Issue', 'Client', 'Label']
}
# 合并聚合规则
full_agg = {**normal_agg, **special_agg}

result_df = df.groupby(
    ['Issue', 'Client'],
    as_index=False,
    sort=False
).agg(full_agg)

SQL 实现(适配SQL Server 2014)

SQL Server 2014没有内置STRING_AGG拼接函数,需要使用FOR XML PATH语法实现字符串拼接,同时配合窗口函数ROW_NUMBER取分组内首行的其余字段值:

WITH grouped_base AS (
    -- 为每个Issue+Client分组的行编号,取编号=1的行作为其余字段的来源
    SELECT 
        I.Issue,
        I.Subject,
        I.type, 
        P.Team, 
        P.Subteam,
        CR.Client,
        I.Priority,
        I.CreatedOn,
        I.BuiltOn,
        I.CreatedBy,
        I.Status,
        ROW_NUMBER() OVER (
            PARTITION BY I.Issue, CR.Client 
            ORDER BY (SELECT 0) -- 按默认顺序取首行,有排序需求可替换为实际字段比如I.CreatedOn
        ) AS row_num
    FROM master.IssueRequests AS I 
    JOIN master.Participants AS P 
      ON P.Issue = I.Issue 
    JOIN master.ClientRecords AS CR 
      ON CR.Issue = I.Issue
    WHERE I.Issue IN ('2652523', '2703670', '2984120')
),
label_merge AS (
    -- 拼接每个分组的所有Label值
    SELECT 
        L.Issue,
        CR.Client,
        STUFF((
            SELECT ',' + L2.Label
            FROM master.IssueLabels AS L2
            WHERE L2.Issue = L.Issue
            FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS Label
    FROM master.IssueLabels AS L
    JOIN master.ClientRecords AS CR ON CR.Issue = L.Issue
    WHERE L.Issue IN ('2652523', '2703670', '2984120')
    GROUP BY L.Issue, CR.Client
)
-- 关联两个结果集得到最终数据
SELECT 
    g.Issue,
    g.Subject,
    g.type,
    g.Team,
    g.Subteam,
    g.Client,
    g.Priority,
    g.CreatedOn,
    l.Label,
    g.BuiltOn,
    g.CreatedBy,
    g.Status
FROM grouped_base g
INNER JOIN label_merge l 
  ON g.Issue = l.Issue AND g.Client = l.Client
WHERE g.row_num = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:45:04