SQL BigQuery:选择基于时间的查询
Posted
技术标签:
【中文标题】SQL BigQuery:选择基于时间的查询【英文标题】:SQL BigQuery : Select query with time basis 【发布时间】:2019-04-24 06:44:33 【问题描述】:我被要求根据时间在数据库中查找用户的位置。 我想在上午 7:00 到上午 10:00 和下午 4:00 到晚上 10:00 之间的特定时间选择月份 3 月 的所有预订活动详细信息。
大查询的时间戳列为 event_timestamp。这样我们就可以获取 3 月份在上午 7:00 到上午 10:00 和下午 4:00 到晚上 10:00 期间发生的所有预订事件。
如何使用 event_timestamp 获取特定时间的数据。
SELECT
x.value.string_value AS lat,
y.value.string_value AS lon, EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp)) as t,
geo.city
FROM
`apps.analytics_185684181.*`,
UNNEST(user_properties) AS x,
UNNEST(user_properties) AS y
WHERE
x.key="user_loc_lat"
AND y.key="user_loc_lon"
AND event_name='reservation'
AND (_TABLE_SUFFIX BETWEEN 'events_20190301'
AND 'events_20190331')
有人知道怎么做吗?
非常感谢!
【问题讨论】:
样本数据和期望的结果会有所帮助。 @GordonLinoff 谢谢。更新了问题。如果不清楚,请告诉我。 【参考方案1】:为什么我不能在 WHERE 子句中使用“小时”
因为 WHERE 子句在执行 SELECT 之前被评估,所以 hour
在评估 WHERE 时还不可用。如果您想简化查询并使用hour
- 您可以先在内部SELECT 中引入hour
字段,然后在外部SELECT 中使用hour
,如下例所示
#standardSQL
SELECT lat, lon, hour FROM (
SELECT
x.value.string_value AS lat,
y.value.string_value AS lon,
EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp)) AS hour
FROM `apps.analytics_185684181.*`,
UNNEST(user_properties) AS x,
UNNEST(user_properties) AS y
WHERE x.key="user_loc_lat"
AND y.key="user_loc_lon"
AND event_name='reservation'
AND (_TABLE_SUFFIX BETWEEN 'events_20190301' AND 'events_20190331')
)
WHERE hour BETWEEN 7 AND 9
OR hour BETWEEN 16 AND 21
【讨论】:
【参考方案2】:我使用带有 HOUR 部分的 EXTRACT 日期函数得到了结果。它将以 24 小时数字(0-23)返回事件时间戳小时。
EXTRACT(part FROM date_expression)
SELECT
x.value.string_value AS lat,
y.value.string_value AS lon, EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp)) AS hour
FROM
`apps.analytics_185684181.*`,
UNNEST(user_properties) AS x,
UNNEST(user_properties) AS y
WHERE EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp))>=7
AND EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp))<=9 AND
x.key="user_loc_lat"
AND y.key="user_loc_lon"
AND event_name='reservation'
AND (_TABLE_SUFFIX BETWEEN 'events_20190301'
AND 'events_20190331')
但是我不能将列名 hour 与 where 子句类似
哪个抛出错误无法识别的名称:小时
非常感谢任何修复/建议和改进。
【讨论】:
在 WHERE 子句中使用EXTRACT(HOUR FROM TIMESTAMP_MICROS(event_timestamp))
有什么问题?
这并没有错。但我只想知道为什么我不能在 WHERE 子句中使用“小时”。
因为在执行 SELECT 之前评估了 WHERE 子句,因此在评估 WHERE 时 hour
尚不可用 - 有意义吗?如果您想简化查询并使用 hour
- 您可以先在内部 SELECT 中引入 hour
字段,然后在外部 SELECT 中使用 hour
- 请参阅我的答案以了解如何执行此操作
哦,是的,我忘记了。我将创建嵌套的 sql 查询。谢谢。以上是关于SQL BigQuery:选择基于时间的查询的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Big Query 的标准 SQL 中使用通配符为特定分区查询多个表
在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?
Big Query - 使用旧版和普通 sql 时的用户数量不同