我目前面临涉及 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 条件一起使用。有人可以看一下并帮助我构建这个查询吗?
我认为您不需要将 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