Bigquery:根据不同的 date_trunc 多次运行查询并将结果合并,而不是多个 UNION ALL

Posted

技术标签:

【中文标题】Bigquery:根据不同的 date_trunc 多次运行查询并将结果合并,而不是多个 UNION ALL【英文标题】:Bigquery: run a query multiple times based on different date_trunc and union the results, instead of multiple UNION ALLs 【发布时间】:2021-06-29 21:22:12 【问题描述】:

我希望从核心表中提取和合并类似的聚合,但在时间段截断方面有所不同。例如,我通常会这样做:

with base as (
  select 
    event_datetime
    , event_location
    , event_uuid
  from events_table
)

select
  date_trunc(event_datetime, day) as day
  , "day" as period_type
  , event_location
  , count(distinct event_uuid) as number_events
from base
group by day, event_location

union all

select
  date_trunc(event_datetime, week) as week
  , "week" as period_type
  , event_location
  , count(distinct event_uuid) as number_events
from base
group by week, event_location

union all

select
  date_trunc(event_datetime, week) as month
  , "month" as period_type
  , event_location
  , count(distinct event_uuid) as number_events
from base
group by month, event_location

有谁知道是否有办法避免必须维护三个单独的子查询并拥有一个根据不同的 date_trunc 重新运行的子查询并将结果合并(产生与上面的代码相同的输出)?我知道我以前的公司有人做到了这一点,但我不知道是怎么做到的。

谢谢!

【问题讨论】:

【参考方案1】:

考虑以下方法

select 
  day, 
  period_type, 
  event_location, 
  count(distinct event_uuid) as number_events
from base t, 
unnest([
  struct('day' as period_type, date_trunc(event_datetime, day) as day),
  struct('week', date_trunc(event_datetime, week)),
  struct('month', date_trunc(event_datetime, month))
]) 
group by day, period_type, event_location

【讨论】:

嗨 Mikhail - 再次感谢您在上面的回答!我在上面的编辑中添加了后续/更改。如果您能再看看并再次帮助我,将不胜感激:) 这不是它在 SO 上的工作方式。如果您有新问题或后续问题 - 请将其作为新问题发布,我/我们将很乐意提供帮助。同时,请将您的问题回滚到原始状态 抱歉!这就说得通了。我删除了上面的编辑并在这里提出了一个新问题:***.com/questions/68538191/… 谢谢! 当然。稍后会检查 很高兴它对你有用 - 也考虑投票给答案! :o)

以上是关于Bigquery:根据不同的 date_trunc 多次运行查询并将结果合并,而不是多个 UNION ALL的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery - DATE_TRUNC 错误

如何在 Google BigQuery 中将日期解析为周年?

BigQuery如何获得每月的总数?

BigQuery 从日期字段中提取星期作为日期范围

时区感知 date_trunc 函数

时区感知date_trunc函数