Sql 收集日期分区表上查询的每日结果
我在BigQuery中有一些名称为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
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
这个查询的问题是
视图
我应该如何构造这样的查询?我很乐意获得有关此查询的具体帮助和有关如何实现类似这样的功能的常规指针,即查询日期分区表。假设每个日期至少有一行,这应该可以工作:
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;