【问题标题】:Complete timeseries using empty rows in SQL在 SQL 中使用空行完成时间序列
【发布时间】:2018-04-04 01:37:10
【问题描述】:

我有一个这样的数据集

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 与我想要的最终数据集合并;但考虑到数据的大小,试图想出一个更有效的解决方案

谢谢

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。

标签: sql time-series missing-data impala


【解决方案1】:

为此,您需要一组所有可能的日期和一组所有可能的 ID,但您确实不需要需要枚举所有组合。 (SQL 在这方面做得很好。)

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

请注意,这是一个没有 ONJOIN。只需将每个可能的日期与每个可能的 ID 连接起来。

如果您还没有将所有日期放在一个位置,您仍然需要先创建该表,然后才能继续操作。如果需要,您可以在临时表中执行此操作,但您需要将该列表放在某个位置以供数据库使用。

【讨论】:

    【解决方案2】:

    以下将创建日期(年和月)和 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) 
    

    【讨论】:

    • 不确定这是不是你要问的。
    • @VoteyDisciple 你所说的“加上创建 X obs prev. to my first in the dataset”是什么意思?
    猜你喜欢
    • 2018-09-27
    • 1970-01-01
    • 2016-04-11
    • 2017-03-07
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2011-07-02
    • 2015-10-17
    相关资源
    最近更新 更多