如何将不同行的Arrival与Departure合并到同一行(按路由取最新EventTime)
解决方案
SQL 实现方案
假设你的原始表名为route_events,字段包含Route、EventType、EventTime、Value,可以通过分组聚合+条件判断实现需求:
SELECT Route, MAX(EventTime) AS LatestEventTime, MAX(CASE WHEN EventType = 'Arrival' THEN Value END) AS Arrival, MAX(CASE WHEN EventType = 'Departure' THEN Value END) AS Departure FROM route_events GROUP BY Route;
如果你的数据库支持PIVOT语法(如SQL Server),也可以用更简洁的写法:
SELECT Route, LatestEventTime, Arrival, Departure FROM ( SELECT Route, EventType, Value, MAX(EventTime) OVER (PARTITION BY Route) AS LatestEventTime FROM route_events ) AS src PIVOT ( MAX(Value) FOR EventType IN ([Arrival], [Departure]) ) AS pvt;
Python Pandas 实现方案
如果用Python处理数据,可以通过pivot_table快速完成合并:
import pandas as pd # 假设原始数据已加载到df中,字段为Route, EventType, EventTime, Value df['EventTime'] = pd.to_datetime(df['EventTime']) # 确保时间格式为datetime类型 # 生成转置后的基础表 result_df = df.pivot_table( index='Route', columns='EventType', values='Value', aggfunc='first' # 每个路由下EventType唯一时用first即可 ).reset_index() # 添加最新EventTime列 result_df['LatestEventTime'] = df.groupby('Route')['EventTime'].max().values # 调整列顺序至目标格式 result_df = result_df[['Route', 'LatestEventTime', 'Arrival', 'Departure']]
也可以用groupby结合自定义聚合逻辑实现:
result_df = df.groupby('Route').agg( LatestEventTime=('EventTime', 'max'), Arrival=('Value', lambda x: x[df.loc[x.index, 'EventType'] == 'Arrival'].iloc[0]), Departure=('Value', lambda x: x[df.loc[x.index, 'EventType'] == 'Departure'].iloc[0]) ).reset_index()
内容的提问来源于stack exchange,提问作者Giri Dharan
相关产品推荐
相关产品推荐

