用于滞后表列的通用存储过程

时间:2015-07-28 10:55:13

标签: mysql lag lead

我需要计算不同频率的回报。为了做到这一点,我希望能够通过 k 单位滞后列中的值。虽然我找到了不同的具体解决方案,但我还是无法进行一般的存储过程(很可能是因为我对mysql缺乏经验)。我怎么能最好地做到这一点?

我有一个包含多个列的表,其中包含以下信息的列:

  • ID
  • 日期
  • 价格

最终结果应该是包含所有原始列的表格, plus 包含价格滞后值的列。

为了使程序保持通用,我可以想象程序会将表名,必要的列名(例如ID,日期,价格)和滞后数 k 作为输入,并附加一个列到表。

1 个答案:

答案 0 :(得分:0)

您可以使用相关子查询执行所需操作。这是一个例子:

select t.*,
       (select t2.price
        from <tablename> t2
        where t2.date < t.date
        order by date
        limit 1 offset 1  -- change the offset for a bigger lag
       ) as price_lag_1
from <tablename> t;

您希望创建通用存储过程不是非常SQL-y。 MySQL不支持表值函数,因此您无法将结果表用作实际表。

如果要将它放在通用的存储过程中,则需要动态SQL来构造SQL语句,使用您传入的特定表和列。

相反,我建议您只是学习如何表达您想要的查询。如果您有多个具有相同结构的表,则可能需要重新访问数据模型。有多个类似的表通常是一个实体不恰当地分布在太多表中的一个例子。