首页 > 解决方案 > MySQL - 将缺失的日期记录添加到表中

问题描述

我有这个数据集,其中仅包含工作日的数据。这是它的样子:

ID  Name        Some Val    Other Val   Date

10  Somebody    33001.93    33001.93    2018-10-01
10  Somebody    33481.93    33481.93    2018-10-02
10  Somebody    33001.93    33001.93    2018-10-03
10  Somebody    33582.76    33582.76    2018-10-04
10  Somebody    33582.73    33582.79    2018-10-05
10  Somebody    33582.76    33582.76    2018-10-08
10  Somebody    33342.76    33342.76    2018-10-09
10  Somebody    33462.76    33462.76    2018-10-10

我的计算需要在一个月的所有日子里填充数据。为了使数据可用,我还需要填充周末的数据。

在上述数据样本中,日期 2018-10-06 和 2018-10-7 的缺失记录在这种情况下需要按最后一个可用值 (2018-10-05) 进行复制。因此,转换后的结果数据集如下所示:

ID  Name        Some Val    Other Val   Date

10  Somebody    33001.93    33001.93    2018-10-01
10  Somebody    33481.93    33481.93    2018-10-02
10  Somebody    33001.93    33001.93    2018-10-03
10  Somebody    33582.76    33582.76    2018-10-04
10  Somebody    33582.73    33582.79    2018-10-05

10  Somebody    33582.73    33582.79    2018-10-06
10  Somebody    33582.73    33582.79    2018-10-07

10  Somebody    33582.76    33582.76    2018-10-08
10  Somebody    33342.76    33342.76    2018-10-09
10  Somebody    33462.76    33462.76    2018-10-10

我正在寻找有关如何保留丢失记录、遍历所有可用行并在丢失的地方插入行的指导。我正在考虑创建一个包含所有日期值的查找表,将它们合并,在没有匹配的地方,我需要插入最后一个可用值。

我在 SQL 方面的经验有限,并且来自 SAS 背景,我可以使用宏来完成此操作。我完全不知道如何在 SQL 中解决这个问题。

需要指导我如何进行。

标签: mysqlsql

解决方案


嗯。. . 这足够了吗?

select ID, Name, val1, val2, date
from t
union all
select id, name, val1, val2, date + interval 1 day
from t
where dayofweek(date) = 6
union all
select id, name, val1, val2, date + interval 2 day
from t
where dayofweek(date) = 6;

如果该月在星期五或星期六结束,这会增加一两天。您可以通过where在子查询中使用子句来解决这个问题。


推荐阅读