如何按ID合并SQL行并保留各状态对应时间信息?
当然可行!这种把多行同ID的数据转换成宽表的需求,在日常数据处理里特别常见~下面给你几种不同场景下的实现方法,你可以按需选择:
方法1:Excel/Power Query(适合非编程用户)
如果你习惯用Excel处理数据,Power Query可以轻松帮你实现:
- 选中你的数据区域,点击「数据」选项卡的「从表格/区域」,把数据导入Power Query编辑器
- 在编辑器里,添加两个自定义列:
- 第一个列命名为
状态列名,公式填:"Status " & Text.From([status]) - 第二个列命名为
时间列名,公式填:"Status " & Text.From([status]) & " Time"
- 第一个列命名为
- 分别基于这两个列做透视:
- 选中
ID和状态列名,点击「转换」→「透视列」,值列选status,高级选项选「不要聚合」 - 同理,再处理时间部分:选中
ID和时间列名,透视列的值列选Time,同样选「不要聚合」
- 选中
- 把两个透视后的表合并(按
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
相关产品推荐
相关产品推荐

