首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -不相等的左连接BigQuery

SQL -不相等的左连接BigQuery
EN

Stack Overflow用户
提问于 2017-09-23 02:02:52
回答 1查看 16K关注 0票数 2

新来的。我试图获得每日和每周活跃用户随着时间的推移。他们有30天的时间被认为是不活跃的。我的目标是创建可以按user_id拆分的图形,以显示队列、区域、类别等。

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

我正在尝试使用以下SQL查询执行左连接,以获取按日期显示的状态:

代码语言:javascript
复制
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

我得到了这个错误:如果没有连接两端的字段相等的条件,就不能使用左外部连接。在BigQuery中,我想知道我如何才能绕过这个问题。我在BigQuery中使用Standard SQL。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-23 03:54:21

以下是针对BigQuery标准SQL的说明,除了不包括未找到任何活动的天数外,大多数情况下都会在查询中再现逻辑

代码语言:javascript
复制
#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

如果出于任何原因,您仍然需要exactly重现您的逻辑-您可以使用最终的左连接来拥抱上面的逻辑,如下所示:

代码语言:javascript
复制
#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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46370728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档