【问题标题】:SQL BigQuery : Select query with time basisSQL BigQuery:选择基于时间的查询
【发布时间】: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 谢谢。更新了问题。如果不清楚,请告诉我。

标签: sql firebase google-bigquery firebase-analytics


【解决方案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 查询。谢谢。
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2021-08-07
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多