SQL - 不等左连接 BigQuery

标签 sql google-bigquery

这里是新的。随着时间的推移,我正在尝试获取每日和每周的活跃用户。他们有 30 天的时间才会被视为不活跃。我的目标是创建可以按 user_id 拆分的图表,以显示同类群组、地区、类别等。

我创建了一个日期表来获取该时间段的每一天,并且我有一个简化的订单表,其中包含我需要计算它的基本信息。

我正在尝试使用以下 SQL 查询执行 Left Join 以按日期获取状态:

WITH daily_use AS (
        SELECT
          __key__.id AS user_id
          , DATE_TRUNC(date(placeOrderDate), day) AS activity_date
        FROM `analysis.Order`
        where isBuyingGroupOrder = TRUE 
          AND testOrder = FALSE
        GROUP BY 1, 2
 ),
dates AS (
        SELECT DATE_ADD(DATE "2016-01-01", INTERVAL d.d DAY) AS date
        FROM
          (
           SELECT ROW_NUMBER() OVER(ORDER BY __key__.id) -1 AS d
           FROM `analysis.Order`
           ORDER BY __key__.id
           LIMIT 1096
          ) AS  d
        ORDER BY 1 DESC
      )

SELECT
      daily_use.user_id
    , wd.date AS date
    , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) AS days_since_last_action
FROM dates AS wd

LEFT JOIN daily_use
    ON wd.date >= daily_use.activity_date
    AND wd.date < DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY)

GROUP BY 1,2

我收到此错误:如果连接两侧的字段相等,则无法使用 LEFT OUTER JOIN。在 BigQuery 中,我想知道如何解决这个问题。我在 BigQuery 中使用标准 SQL。

谢谢

最佳答案

以下是针对 BigQuery 标准 SQL 的,主要是在您的查询中重现逻辑,但不包括根本没有发现任何事件的日子

#standardSQL
SELECT
    daily_use.user_id
  , wd.date AS DATE
  , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) AS days_since_last_action
FROM dates AS wd
CROSS JOIN daily_use
WHERE wd.date BETWEEN 
  daily_use.activity_date AND DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY)
GROUP BY 1,2
-- ORDER BY 1,2

如果出于某种原因您仍然需要准确地重现您的逻辑 - 您可以使用 above 和 final left join 如下所示:

#standardSQL
SELECT *
FROM dates AS wd
LEFT JOIN (
  SELECT
    daily_use.user_id
    , wd.date AS date
    , MIN(DATE_DIFF(wd.date, daily_use.activity_date, DAY)) AS days_since_last_action
  FROM dates AS wd
  CROSS JOIN daily_use
  WHERE wd.date BETWEEN 
    daily_use.activity_date AND DATE_ADD(daily_use.activity_date, INTERVAL 30 DAY)
  GROUP BY 1,2
) AS daily_use
USING (date)
-- ORDER BY 1,2

关于SQL - 不等左连接 BigQuery,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46370728/

相关文章:

sql - 通过外键约束强制关系?

sql - BigQuery 选择 * 两列除外

sql - 在 PostgreSQL 中直到当前日期的每月工作日

sql - 我可以将列的默认值设置为同一表中同一行的另一列的字符串吗?

mysql - 并搜索 MySQL 多对多表

mysql - 将 SELECT 放入我的列中

sql - SQL中计算百分比的简单方法是什么?

firebase - 将 Firebase Analytics 链接到 Bigquery 时,数据何时导出?

google-bigquery - BigQuery : How to autoreload table with new storage JSON files?

sql - ARRAY_CONTACT() 返回空数组