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 时的用户数量不同

SQL BigQuery:选择具有时间基础的查询

BigQuery - 基于字段/过滤器构建动态选择语句/查询

查询 Big Query 重复模式