Sql 收集日期分区表上查询的每日结果

Sql 收集日期分区表上查询的每日结果,sql,google-bigquery,Sql,Google Bigquery,我在BigQuery中有一些名称为counts_20171220的表,其行采用这种格式(每个contentId日期只有一行): 我想为给定的contentId在给定的时间范围内生成一个视图计数列表,没有间隙,例如: | date | views | +------------+--------+ | 2017-12-01 | NULL | -- or 0 | 2017-12-02 | NULL | -- or 0 | 2017-12-03 | 728314 | | 2017

我在BigQuery中有一些名称为
counts_20171220
的表,其行采用这种格式(每个
contentId
日期只有一行):

我想为给定的
contentId
在给定的时间范围内生成一个视图计数列表,没有间隙,例如:

|       date |  views |
+------------+--------+
| 2017-12-01 |   NULL | -- or 0
| 2017-12-02 |   NULL | -- or 0
| 2017-12-03 | 728314 |
| 2017-12-04 | 328774 |
| 2017-12-05 |  28242 |
...
| 2017-12-20 |   NULL | -- or 0
为了做到这一点,我想我需要使用
*
\u table\u后缀
,但我无法确定如何包含没有该
contentId
条目的日期。我得到的最接近的查询是:

#standardSQL
SELECT
  _table_suffix AS date,
  ARRAY_AGG(views) AS views
FROM
  `test.counts_*`
WHERE
  _table_suffix BETWEEN '20171201' AND '20171220'
  AND contentId = 'cb32edc0'
GROUP BY
  _table_suffix,
  contentId
ORDER BY
  date
这个查询的问题是

  • 它不包括所有日期的行,只包括表中有“cb32edc0”项的日期
  • 由于它的结构,我需要使用一个(这里没有用)聚合函数来提取
    视图

  • 我应该如何构造这样的查询?我很乐意获得有关此查询的具体帮助和有关如何实现类似这样的功能的常规指针,即查询日期分区表。

    假设每个日期至少有一行,这应该可以工作:

    SELECT
      PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS date,
      IFNULL(MAX(IF(contentId = 'cb32edc0', views, NULL)), 0) AS views
    FROM `test_counts_*`
    WHERE _TABLE_SUFFIX BETWEEN '20171201' AND '20171220'
    GROUP BY date;
    

    它不是显式筛选与所需的
    contentId
    不匹配的行,而是使用一个带有聚合函数的条件将它们从结果中排除。如果组中没有包含所需
    contentId
    的行,则
    IFNULL
    确保表达式返回
    0
    ,而不是
    NULL
    ,谢谢!那真是太优雅了!
    SELECT
      PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) AS date,
      IFNULL(MAX(IF(contentId = 'cb32edc0', views, NULL)), 0) AS views
    FROM `test_counts_*`
    WHERE _TABLE_SUFFIX BETWEEN '20171201' AND '20171220'
    GROUP BY date;