【问题标题】:BigQuery: Join based on closest timestampBigQuery:基于最近的时间戳加入
【发布时间】:2020-01-29 22:09:13
【问题描述】:

我根据 BigQuery 中最接近的时间戳加入两个表并收到此错误。连接谓词中的表不支持子查询。

SELECT gs.user_session_id
      ,dtc._date
      ,dtc.hit_timestamp _timestamp
      ,dtc.user_id
FROM  ga.2_deduped_twice_click_data dtc LEFT JOIN ga.sessions gs ON dtc.user_id = gs.user_id 
and dtc.hit_timestamp = ( SELECT dtc2.hit_timestamp FROM ga.2_deduped_twice_click_data dtc2 order by ABS(TIMESTAMP_DIFF(dtc.hit_timestamp, gs._timestamp, MILLISECOND)) LIMIT 1 )

【问题讨论】:

  • ROW_NUMBER() OVER(PARTITION BY dtc.user_id, dtc._date ORDER BY ABS(TIMESTAMP_DIFF(dtc._timestamp, gs._timestamp, SECOND))) 作为 row_num。 -- 在 row_num=1 的下一阶段过滤器中

标签: google-analytics google-bigquery


【解决方案1】:

您可以尝试混合使用ARRAY_AGGORDER BY diff LIMIT 1

WITH a AS (
  SELECT * FROM UNNEST(
    [STRUCT(TIMESTAMP('2018-01-02 20:01:00') AS time, 'monkey' AS animal)
     ,STRUCT('2018-03-04 10:10:10', 'lion')
     ,STRUCT('2018-07-04 10:10:10', 'donkey')
    ]) 
),
b AS  (
  SELECT * FROM UNNEST(
    [STRUCT(TIMESTAMP('2017-01-02 10:01:00') AS time, 'one' AS festival)
     ,STRUCT('2019-03-04 10:10:10', 'two')
     ,STRUCT('2018-07-04 10:10:10', 'three')
     ,STRUCT('2018-03-05 10:10:10', 'four')
    ]) 
)


SELECT b,
  (SELECT AS STRUCT * 
   FROM a 
   ORDER BY ABS(TIMESTAMP_DIFF(b.time, a.time, SECOND))
   LIMIT 1) closest
FROM b

【讨论】:

  • 这看起来正是我所需要的,但 BQ 告诉我“不支持引用其他表的相关子查询,除非它们可以去相关,例如通过将它们转换为有效的 JOIN。”甚至添加 where 子句以仅限制具有匹配日期的行之后:``` select event, ( select as struct * from master.telemetry as telemetry where EXTRACT(DATE FROM event.time) = EXTRACT(DATE FROM telemetry.time)按 ABS(TIMESTAMP_DIFF(event.time, telemetry.time, SECOND)) 限制 1 ) 作为来自 master.event 的遥测作为事件限制 10 ```
  • 请发布一个新问题,并提供一个我们可以用来解决此问题的工作示例
  • 谢谢,我刚刚发布了一个新问题:stackoverflow.com/questions/59380153/…
猜你喜欢
  • 2019-12-09
  • 1970-01-01
  • 2015-03-14
  • 2013-03-31
  • 2021-11-17
  • 2016-05-31
  • 2021-04-17
  • 1970-01-01
相关资源
最近更新 更多