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

MySQL:如何实现时间序列数据的年度同比列匹配(类Excel的VLOOKUP)

嘿,你这个需求我太熟了!处理时间序列里的同期数据,不管是用Python的Pandas还是SQL,都有对应Excel里VLOOKUP/INDEX MATCH的替代方案,我给你分场景说清楚:

场景1:数据在Pandas DataFrame中

假设你的数据已经加载到Pandas的DataFrame里,命名为df,我们可以用**自连接(merge)**来实现匹配,逻辑和Excel的函数完全对应:

方法1:依赖已有的prev_year_id字段

如果你的数据已经提前生成了prev_year_id(就像你给出的表结构那样),直接用这个字段做匹配就行:

# 先提取上一年度数据的唯一标识和对应值,重命名避免冲突
prev_year_data = df[['unique_id', 'value']].rename(columns={
    'unique_id': 'match_id',
    'value': 'prev_year_value'
})

# 把原表和上一年度数据通过prev_year_id和match_id关联
result_df = df.merge(prev_year_data, left_on='prev_year_id', right_on='match_id', how='left')

# 删掉不需要的中间列
result_df = result_df.drop('match_id', axis=1)

处理完后,result_df会新增一列prev_year_value,就是对应上一年度的数据;如果某条记录没有匹配到(比如最早年份的行),这一列会显示NaN,完全符合预期。

方法2:不依赖prev_year_id(更灵活)

要是你没预先生成prev_year_id,也可以直接通过id和年份减一的日期来匹配,不用额外生成字段:

import pandas as pd

# 先从日期字段里生成上一年的对应日期
df['prev_year_date'] = df['date'] - pd.DateOffset(years=1)

# 准备上一年度的匹配表,只保留id、日期和值
prev_year_data = df[['id', 'date', 'value']].rename(columns={
    'date': 'match_date',
    'value': 'prev_year_value'
})

# 通过id和上一年日期做关联
result_df = df.merge(prev_year_data, left_on=['id', 'prev_year_date'], right_on=['id', 'match_date'], how='left')

# 清理临时列
result_df = result_df.drop(['prev_year_date', 'match_date'], axis=1)
场景2:数据在SQL数据库中

如果你的数据存在数据库里,用**自连接(SELF JOIN)**就能搞定,逻辑和Excel里的查找函数一致:

方法1:依赖prev_year_id字段

SELECT 
    main.date,
    main.unique_id,
    main.prev_year_id,
    main.id,
    main.value,
    prev.value AS prev_year_value
FROM 
    your_table main
LEFT JOIN 
    your_table prev ON main.prev_year_id = prev.unique_id;

用LEFT JOIN是为了保证即使没有上一年的数据(比如2015年的记录),主表的内容也不会丢失,prev_year_value会显示为NULL。

方法2:不依赖prev_year_id

直接通过id和日期偏移来匹配上一年的同期数据:

SELECT 
    main.date,
    main.unique_id,
    main.id,
    main.value,
    prev.value AS prev_year_value
FROM 
    your_table main
LEFT JOIN 
    your_table prev 
    ON main.id = prev.id 
    AND DATEADD(year, -1, main.date) = prev.date;

不同数据库的日期偏移函数可能略有不同,比如MySQL用DATE_SUB(main.date, INTERVAL 1 YEAR),PostgreSQL用main.date - INTERVAL '1 year',根据你的数据库类型调整就行。

内容的提问来源于stack exchange,提问作者Z.Mack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:05:32