将缺失的日期行添加到BigQuery表

时间:2019-05-28 08:59:57

标签: sql google-bigquery

我有一张表,其中的1行是代表行时间的整数。问题在于表不完整,缺少时间戳。

我想填充缺失的值,这样每10秒就有一行。我希望其余的列为修女(稍后我将向前填充这些修女)。

10秒基本上是10,000。 如果这是python,范围将是:

   range(
      min(table[column]), 
      max(table[column]), 
      10000
   )

3 个答案:

答案 0 :(得分:1)

如果您的值严格分开10秒,并且缺少10秒间隔的倍数,则可以采用这种方法来填补数据漏洞:

WITH minsmax AS (
   SELECT
     MIN(time) AS minval,
     MAX(time) AS maxval
   FROM `dataset.table` 
)

SELECT
   IF (d.time <= i.time, d.time, i.time) as time,
   MAX(IF(d.time <= i.time, d.value, NULL)) as value
FROM (
  SELECT time FROM minsmax m, UNNEST(GENERATE_ARRAY(m.minval, m.maxval+100, 100)) AS time 
) AS i
LEFT JOIN `dataset.table` d ON 1=1
WHERE ABS(d.time - i.time) >= 100
GROUP BY 1
ORDER BY 1

希望这会有所帮助。

答案 1 :(得分:0)

您可以使用数组。对于数字,您可以执行以下操作:

select n
from unnest(generate_array(1, 1000, 1)) n;

generate_timestamp_array()generate_date_array()也有类似的功能,如果您确实需要这些类型的话。

答案 2 :(得分:0)

我最终通过python API使用以下查询:

    """
    SELECT
      i.time,
      Sensor_Reading,
      Sensor_Name

    FROM (
      SELECT time FROM UNNEST(GENERATE_ARRAY({min_time}, {max_time}+{sampling_period}+1, {sampling_period})) AS time 
    ) AS i

    LEFT JOIN
      `{input_table}` AS input
    ON
      i.time =input.Time
    ORDER BY i.time

    """.format(sampling_period=sampling_period, min_time=min_time,
               max_time=max_time,
               input_table=input_table)

感谢两个答案