无法从 BigQuery 中的时间戳中提取日期
Posted
技术标签:
【中文标题】无法从 BigQuery 中的时间戳中提取日期【英文标题】:Can't Extract Date from Timestamp in BigQuery 【发布时间】:2016-08-29 03:01:06 【问题描述】:我正在尝试获取上周与特定实体 ID 关联的所有行。每行都有一个时间戳。我想通过从日期时间时间戳中提取日期来按天对这些实体进行分组,但是当我尝试时,我得到了
错误: (L6:28): GROUP BY 中的表达式 STRFTIME_UTC_USEC([data_timestamp], '%Y-%m-%d') 无效
来自大查询。 DATE() 函数似乎有问题。
这是我正在运行的完整查询:
SELECT Count(*) FROM [myproj:mydataset.mytable]
WHERE
bool_property=False
AND
entity_id=5667423172689920
AND
DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7
GROUP BY DATE(data_timestamp)
查看数据,看起来质量,这里称为“data_timestamp”,实际上是一个正确的时间戳;我真的不明白为什么 DATE() 函数会失败。
任何帮助或提示?谢谢!
【问题讨论】:
【参考方案1】:您的查询有两个问题
-
在 BigQuery Legacy SQL 中,您不能在 GROUP BY 语句中使用表达式,
而只是字段(顺便说一句,BigQuery 标准 SQL 中不存在此限制)
当您执行 GROUP BY 时 - 您不能只是简单地选择所有字段,而是需要使用一些聚合函数,例如 COUNT 或 SUM 等(对于那些不属于 GROUP VY 的字段)
所以您的查询可能如下所示:
SELECT DATE(data_timestamp) AS dt, COUNT(1) AS cnt
FROM [myproj:mydataset.mytable]
WHERE bool_property=FALSE
AND entity_id=5667423172689920
AND DATEDIFF(CURRENT_DATE(), data_timestamp) <= 7
GROUP BY dt
【讨论】:
好吧,看来我使用的是标准 sql,因为我已经使用 'GROUP BY' 测试了其他查询,它们似乎工作正常。不过,您对聚合函数的看法是正确的。我改变了我的问题以适应。我真正的问题不是 GROUP BY,而是 DATE 函数,这似乎不合逻辑地不起作用。 基于您使用的语法 - 您使用的是旧版 sql。您是否尝试在我的答案中运行查询?问题不在于日期函数,而实际上是您在旧版 sql 中的 group by 语句中使用了它 是的,这完全有效!虽然,我不确定我明白为什么。我想你的理论/假设是日期函数没有工作,因为它在 GROUP BY 中?介意多解释一下这个查询是如何工作的吗? 正如我已经解释过的 - 在 bigquery 遗留 sql 中,您不能在 group by 语句中使用表达式,而是需要在 select 语句DATE(data_timestamp) AS dt
中预先计算此表达式,然后使用新的“字段”(@987654323 @) 分组。这是通常的做法
啊我明白了,不是 GROUP BY 不行,是里面的表达式。惊人的。非常感谢!【参考方案2】:
不幸的是,旧版 SQL 不允许使用 GROUP BY 表达式,只能使用列名。但是使用标准 SQL,您可以做到:
SELECT * FROM myproj.mydataset.mytable
WHERE
bool_property=False AND
entity_id=5667423172689920 AND
DATE_DIFF(CURRENT_DATE(), EXTRACT(DATE FROM data_timestamp), DAY) <= 7
GROUP BY EXTRACT(DATE FROM data_timestamp)
【讨论】:
似乎 bigquery 确实包含 group by 虽然 cloud.google.com/bigquery/query-reference以上是关于无法从 BigQuery 中的时间戳中提取日期的主要内容,如果未能解决你的问题,请参考以下文章