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

如何按ID合并SQL行并保留各状态对应时间信息?

当然可行!这种把多行同ID的数据转换成宽表的需求,在日常数据处理里特别常见~下面给你几种不同场景下的实现方法,你可以按需选择:

方法1:Excel/Power Query(适合非编程用户)

如果你习惯用Excel处理数据,Power Query可以轻松帮你实现:

  1. 选中你的数据区域,点击「数据」选项卡的「从表格/区域」,把数据导入Power Query编辑器
  2. 在编辑器里,添加两个自定义列:
    • 第一个列命名为状态列名,公式填:"Status " & Text.From([status])
    • 第二个列命名为时间列名,公式填:"Status " & Text.From([status]) & " Time"
  3. 分别基于这两个列做透视:
    • 选中ID和状态列名,点击「转换」→「透视列」,值列选status,高级选项选「不要聚合」
    • 同理,再处理时间部分:选中ID和时间列名,透视列的值列选Time,同样选「不要聚合」
  4. 把两个透视后的表合并(按ID列匹配),最后重命名列、调整顺序,就能得到你想要的格式啦

方法2:SQL(适合数据库场景)

如果数据存在数据库里,用条件聚合的方式就能直接查询出结果:

SELECT 
    ID,
    MAX(CASE WHEN status = 2 THEN status END) AS `Status 2`,
    MAX(CASE WHEN status = 2 THEN Time END) AS `Status 2 Time`,
    MAX(CASE WHEN status = 4 THEN status END) AS `Status 4`,
    MAX(CASE WHEN status = 4 THEN Time END) AS `Status 4 Time`,
    MAX(CASE WHEN status = 6 THEN status END) AS `Status 6`,
    MAX(CASE WHEN status = 6 THEN Time END) AS `Status 6 Time`,
    MAX(CASE WHEN status = 9 THEN status END) AS `Status 9`,
    MAX(CASE WHEN status = 9 THEN Time END) AS `Status 9 Time`
FROM your_table
GROUP BY ID;

这里用MAX是因为每个ID对应每个status只有一行,用MAX/MIN都能取出唯一值。如果你的status是动态不确定的,可以用动态SQL自动生成这些列。

方法3:Python Pandas(适合编程场景)

如果用Python处理数据,Pandas的透视功能可以快速实现需求:

import pandas as pd

# 模拟你的数据(实际可以用pd.read_csv/pd.read_sql读取)
df = pd.DataFrame({
    'ID': [12345]*4,
    'status': [4, 2, 6, 9],
    'Time': ['1:23', '2:30', '2:40', '3:00']
})

# 生成状态列和时间列的名称
df['status_col'] = 'Status ' + df['status'].astype(str)
df['time_col'] = 'Status ' + df['status'].astype(str) + ' Time'

# 分别透视状态和时间数据
status_pivot = df.pivot(index='ID', columns='status_col', values='status').reset_index()
time_pivot = df.pivot(index='ID', columns='time_col', values='Time').reset_index()

# 合并两个透视表
result = pd.merge(status_pivot, time_pivot, on='ID')

# 可选:按状态数字排序列
sorted_columns = sorted(result.columns[1:], key=lambda x: int(x.split(' ')[1]))
result = result[['ID'] + sorted_columns]

print(result)

运行后就能得到符合你要求的宽表格式。

核心思路其实都是行转列(透视),把每个不同的status映射成对应的状态列和时间列,再按ID合并到同一行里~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:32:59