在bigquery中使用GROUP BY日期(日期时间字段)和HAVING时出现问题

问题描述 投票:0回答:1

我目前面临涉及 GROUP BY 和 HAVING 子句的 SQL 查询问题。我尝试按日期(SALE_CREATION_DATETIME)或CAST(SALE_CREATION_DATETIME AS DATE)对结果进行分组,同时根据某些条件进行过滤。然而,我遇到了困难,无法达到预期的效果。

这是我的查询:

SELECT 
  DATE(T.SALE_CREATION_DATETIME) AS CREATION_DATE,
  count(), sum(), ...,
  T.ClientFlag AS CLIENT_FLAG,
  T.CampaignFlag AS CAMPAIGN_FLAG, 
  CASE WHEN ... THEN TRUE
  ELSE FALSE
  END AS TASK_FLAG,...
FROM
  `my_project.dataset.TABLE_TASK` AS T
LEFT JOIN
  `my_project.dataset.TABLE_USER` AS U
ON
  T.OwnerId = U.Id
LEFT JOIN
  `my_project.dataset.TABLE_CONVERSIONS` AS TC
ON
  T.Id = TC.EVENT_ID
GROUP BY 
  DATE(T.SALE_CREATION_DATETIME),
  T.ClientFlag,
  T.CampaignFlag,
     ...
  HAVING TASK_FLAG is TRUE

BIGQUERY 中的错误:

SELECT 列表表达式引用 T.SALE_CREATION_DATETIME ,即 既不分组也不聚合

PS:我必须按 DATE() 而不是字段本身进行分组,以避免重复。

问题是否与分组或 HAVING 字段有关?我收到了意外的结果,我怀疑问题可能出在我如何将 GROUP BY 与 HAVING 条件一起使用。有人可以看一下并帮助我构建这个查询吗?

sql google-cloud-platform google-bigquery
1个回答
0
投票

我认为您不需要将 DATE() 包装在 GROUP BY 子句中,因此您应该能够使用:

SELECT 
  DATE(T.SALE_CREATION_DATETIME) AS CREATION_DATE,
  count(), sum(), ...,
  T.ClientFlag AS CLIENT_FLAG,
  T.CampaignFlag AS CAMPAIGN_FLAG, 
  CASE WHEN ... THEN TRUE
  ELSE FALSE
  END AS TASK_FLAG,...
FROM
  `my_project.dataset.TABLE_TASK` AS T
LEFT JOIN
  `my_project.dataset.TABLE_USER` AS U
ON
  T.OwnerId = U.Id
LEFT JOIN
  `my_project.dataset.TABLE_CONVERSIONS` AS TC
ON
  T.Id = TC.EVENT_ID
GROUP BY 
  T.SALE_CREATION_DATETIME,
  T.ClientFlag,
  T.CampaignFlag,
     ...
  HAVING TASK_FLAG is TRUE
© www.soinside.com 2019 - 2024. All rights reserved.