Google bigquery 不与GROUP BY一起使用,并且具有

Google bigquery 不与GROUP BY一起使用,并且具有,google-bigquery,Google Bigquery,我们正在尝试合计所有订单收入,但我们没有注册付款成功事件。失败的订单失败的订单要么没有付款尝试,要么是付款失败事件 SELECT o.campaign.id AS campaign_id, o.campaign.template_id AS campaign_template_id, o.campaign.lang AS language, o.campaign.split_idx AS campaign_split_id, count(distinct o.order_id) AS order

我们正在尝试合计所有订单收入,但我们没有注册付款成功事件。失败的订单失败的订单要么没有付款尝试,要么是付款失败事件

SELECT
o.campaign.id AS campaign_id,
o.campaign.template_id AS campaign_template_id,
o.campaign.lang AS language,
o.campaign.split_idx AS campaign_split_id,
count(distinct o.order_id) AS orders,
SUM(o.total) AS totalrevenue,
SUM(o.shipping_value) AS shipping_value
FROM [wr_live.order] AS o
GROUP BY campaign_id, campaign_template_id, language, campaign_split_id
HAVING
o.order_id NOT IN (
SELECT order_id
FROM [wr_live.order_event] as e
WHERE e.order_id = o.order_id AND e.event = 'payment' and e.status = 1
) 

正如您所看到的,我们正在运行一个NOT IN子句,在该子句中,我们检查该特定订单是否没有任何付款事件,状态=1


我们有关于付费谷歌企业支持的案例05024161,但显然他们无法提供帮助。

请注意,HAVING子句只能引用SELECT子句中定义的字段。如果字段有别名,则必须使用它;如果没有,请改用聚合字段名

在查询中,select子句中没有Order\u Id。 尝试将其放在GROUPBY之前的where子句中

比如:

SELECT
o.campaign.id AS campaign_id,
o.campaign.template_id AS campaign_template_id,
o.campaign.lang AS language,
o.campaign.split_idx AS campaign_split_id,
count(distinct o.order_id) AS orders,
SUM(o.total) AS totalrevenue,
SUM(o.shipping_value) AS shipping_value
FROM(
Select * from  [wr_live.order] 
Where order_id NOT IN (
SELECT order_id
FROM [wr_live.order_event] as e
WHERE  e.event = 'payment' and e.status = 1
) 
)AS o
GROUP BY campaign_id, campaign_template_id, language, campaign_split_id

此外,BQ不支持子查询引用父查询。如果您需要,请尝试替换为Join

作为BigQuery团队的成员,我能够运行您的查询并尝试不同的方法。似乎只要删除对o.order_id的引用并修改一些字段名,它就可以在不加入反连接的情况下运行

SELECT
  campaign.id AS campaign_id,
  campaign.template_id AS campaign_template_id,
  campaign.lang AS language,
  campaign.split_idx AS campaign_split_id,
  COUNT(DISTINCT order_id) AS orders,
  SUM(total) AS totalrevenue,
  SUM(shipping_value) AS shipping_value
FROM
  [wr_live.order]
WHERE
  order_id NOT IN (
  SELECT
    order_id
  FROM
    [wr_live.order_event]
  WHERE
    event = 'payment'
    AND status = 1
    )
GROUP BY
  campaign_id,
  campaign_template_id,
  language,
  campaign_split_id;

此查询在不到10秒内运行了几次。我不能保证它总是那么快,但你可能想试试。

你能提供一个公共样本数据集来处理查询吗?@FelipeHoffa我已经与谷歌支持部门共享了该数据集。@FelipeHoffa显然你能调查一下为什么支持部门不能很快回答这个问题。另外,事实证明没有官方的BQ支持,你能确认吗?有支持,他们应该涵盖BigQuery。如果答案不令人满意,请通过支持升级。同时,我有有限的资源来进一步调查这个问题——我旅行时的连通性有限。正如您所见,这并不能阻止我偶尔查看StackOverflow,尽我所能提供帮助。@FelipeHoffa这里的答案是令人满意的,但支持在4天内无法帮助我。这是我想理解的。Mario告诉我他不是BQ的一员,他没有经验,看起来BQ没有人回答添加到付费企业支持的问题。我尝试了你的问题,结果是一样的:查询失败错误:在表“e”中找不到字段“o.order_id”;你是说“订单id”吗?我写这个是盲目的,没有真正的模式参考。。。显然我错过了什么。在我的编辑后检查。我在您的编辑后检查,仍然是相同的错误消息错误:在表“e”中找不到字段“o.order_id”;你是说“订单号”吗?作业ID:Aerovious-forge-504:Job_5XQTd_R8BUfAx1MlY80cRpetmyIBQ不支持子查询引用父查询。如果你需要它,试着用JoinIt替换它,它现在可以工作了,但是需要62.9秒的时间。
SELECT
  campaign.id AS campaign_id,
  campaign.template_id AS campaign_template_id,
  campaign.lang AS language,
  campaign.split_idx AS campaign_split_id,
  COUNT(DISTINCT order_id) AS orders,
  SUM(total) AS totalrevenue,
  SUM(shipping_value) AS shipping_value
FROM
  [wr_live.order]
WHERE
  order_id NOT IN (
  SELECT
    order_id
  FROM
    [wr_live.order_event]
  WHERE
    event = 'payment'
    AND status = 1
    )
GROUP BY
  campaign_id,
  campaign_template_id,
  language,
  campaign_split_id;