LEFT OUTER JOIN 在 bigquery 上创建子查询时出错

Posted

技术标签:

【中文标题】LEFT OUTER JOIN 在 bigquery 上创建子查询时出错【英文标题】:LEFT OUTER JOIN Error creating a subquery on bigquery 【发布时间】:2019-05-14 18:57:50 【问题描述】:

我正在尝试从我 bq 上的事件表中评估 MAL、WAL 和 DAU...

我创建一个查询查找 DAU 并与他一起查找 WAU 和 MAU, 但它不起作用,我收到了这个错误:

LEFT OUTER JOIN cannot be used without a condition that is an equality of fields from both sides of the join.

这是我的问题

WITH dau AS (
  SELECT 
      date, 
      COUNT(DISTINCT(events.device_id)) as DAU_explorer         
  FROM `workspace.event_table` as events
  GROUP BY 1
)

SELECT  
  date, 
  dau, 
  (SELECT 
      COUNT(DISTINCT(device_id))  
     FROM `workspace.event_table` as events
     WHERE events.date BETWEEN DATE_ADD(dau.date, INTERVAL -30 DAY)  AND dau.date
     ) AS mau,
  (SELECT 
      COUNT(DISTINCT(device_id)) as DAU_explorer  
    FROM `workspace.event_table` as events
    WHERE events.date BETWEEN DATE_ADD(dau.date, INTERVAL -7 DAY)  AND dau.date
       ) AS wau
FROM dau

我的错误在哪里?不能在 bq 上运行这样的子查询吗?

【问题讨论】:

@JaimeDrq 他已经在顶部提供了错误。 :谢谢,我没有意识到...... @GabrelVelhoGhellere。 . .不可能在 BigQuery 中编写这样的查询(唉)。而且,这个错误不容易解决。 谢谢@GordonLinoff,你知道另一种在sql中评估这个kpi的方法吗?像python中的.rolling(30).sum()和rolling(7).sum()? @GabrielVelhoGhellere。 . .这些不是滚动总和(这会更容易一些)。这些是滚动不同的计数。 【参考方案1】:

试试这个:

WITH data AS (
  SELECT DATE(creation_date) date, owner_user_id device_id
  FROM `bigquery-public-data.***.posts_questions` 
  WHERE EXTRACT(YEAR FROM creation_date)=2017
)

#standardSQL
SELECT DATE_SUB(date, INTERVAL i DAY) date_grp
 , COUNT(DISTINCT IF(i<31,device_id,null)) unique_30_day_users
 , COUNT(DISTINCT IF(i<8,device_id,null)) unique_7_day_users
FROM `data`, UNNEST(GENERATE_ARRAY(1, 30)) i
GROUP BY 1
ORDER BY date_grp
LIMIT 100
OFFSET 30

如果您正在寻找more efficient solution, try approximate results。

【讨论】:

谢谢,这种处理数组的方法非常有趣,我会阅读更多。效果很好,谢谢。

以上是关于LEFT OUTER JOIN 在 bigquery 上创建子查询时出错的主要内容,如果未能解决你的问题,请参考以下文章

关于mysql中的left join和left outer join的区别

SQL中的left outer join,inner join,right outer join用法详解

“,”“natural join”“natural left outer join”“natural right outer join”的用法总结

SQL Server 在视图查询中将 LEFT JOIN 替换为 LEFT OUTER JOIN

SQL Server 中的 LEFT JOIN 与 LEFT OUTER JOIN

Oracle表与表之间的连接方式(内连接:inner join 外连接 全连接: full outer join左连接:left outer join 右连接:right outer join(代码