在sql中使用空行完成时间序列

fnvucqvd  于 2021-06-26  发布在  Impala
关注(0)|答案(2)|浏览(409)

我有这样一个数据集

Date    ID
201401  1
201402  1
201404  1
201301  2
201304  2

我正在努力填补空白,再加上创建x obs prev。我在数据集中的第一个。参见下面的示例

Date    ID
201311  1
201312  1
201401  1
201402  1
201403  1
201404  1
201211  2
201212  2
201301  2
201302  2
201303  2
201304  2

它总是可以强制它,为每个id创建每个可能的日期,然后根据日期和id与我想要的最终数据集合并;但是考虑到数据的大小,我们正在尝试一种更有效的解决方案
谢谢

2w3kk1z5

2w3kk1z51#

下面将创建日期(年和月)和ID的每个组合。

select y.yyyy + m.mm as yyyymm, d.id
from (select distinct id from dataset ) d
cross join 
(select distinct substring(yyyymm, 1, 4) as yyyy from dataset ) y
cross join 
(values ('01' ),( '02'),( '03') ,( '04'),('05'),('06'),
        ('07'),( '08'),( '09'),('10'),('11'),('12' ))  m(mm)
jpfvwuh4

jpfvwuh42#

为此,您需要一组每个可能的日期和一组每个可能的id,但不需要枚举所有的组合(sql在这方面非常出色。)

SELECT dates.date, ids.id
FROM dates
INNER JOIN ids

注意这是一个 JOIN 没有一个 ON . 把每一个可能的日期和每一个可能的id联系起来。
如果您还没有将所有日期都放在一个地方,那么仍然需要创建该表才能继续。如果需要的话,可以在临时表中完成,但是需要将该列表放在数据库的某个地方。

相关问题