Google cloud platform 在语句导致联接错误的情况下,在临时函数中对等式求反

Google cloud platform 在语句导致联接错误的情况下,在临时函数中对等式求反,google-cloud-platform,google-bigquery,bigquery-standard-sql,Google Cloud Platform,Google Bigquery,Bigquery Standard Sql,我试图统计也符合条件的不同用户(在本例中,deleted不为TRUE)。我需要每月对目标月内活跃的用户和前几个月活跃的用户进行分组 为了检索前几个月,我使用了一个否定的等式(格式_DATE(“%Y%m',DATE(timestamp))!=CONCAT(year,month)),但当我这样做时,我收到了“Error:LEFT OUTER JOIN不能在没有条件的情况下使用,条件是JOIN两边的字段相等”。使用不带否定的等式将成功运行 我已经看过了,但这两个问题都是在使用显式的连接的上下文中提出的

我试图统计也符合条件的不同用户(在本例中,
deleted不为TRUE
)。我需要每月对目标月内活跃的用户和前几个月活跃的用户进行分组

为了检索前几个月,我使用了一个否定的等式(
格式_DATE(“%Y%m',DATE(timestamp))!=CONCAT(year,month)
),但当我这样做时,我收到了“Error:LEFT OUTER JOIN不能在没有条件的情况下使用,条件是JOIN两边的字段相等”。使用不带否定的等式将成功运行

我已经看过了,但这两个问题都是在使用显式的
连接的上下文中提出的

下面的代码复制了该问题,可以在BigQuery web控制台中执行

CREATE TEMPORARY FUNCTION getCurrentCount(year STRING, month STRING) AS ((
  SELECT
    COUNT(DISTINCT t.by) distinct_count
  FROM 
    `bigquery-public-data.hacker_news.full` AS t
  WHERE
    FORMAT_DATE('%Y%m', DATE(timestamp)) = CONCAT(year, month) AND
    deleted IS NOT TRUE
));

CREATE TEMPORARY FUNCTION getPreviousCount(year STRING, month STRING) AS ((
  SELECT
    COUNT(DISTINCT t.by) distinct_count
  FROM 
    `bigquery-public-data.hacker_news.full` AS t
  WHERE
    FORMAT_DATE('%Y%m', DATE(timestamp)) != CONCAT(year, month) AND
    deleted IS NOT TRUE
));

WITH easy_cohorts AS (
  SELECT
    t.by author,
    FORMAT_DATE('%Y', DATE(timestamp)) year,
    FORMAT_DATE('%m', DATE(timestamp)) month
  FROM
    `bigquery-public-data.hacker_news.full` AS t
)

SELECT
  year,
  month,
  COUNT(author) total_authors,
  getCurrentCount(year, month) distinct_current_authors,
  getPreviousCount(year, month) distinct_previous_authors
FROM
  easy_cohorts
GROUP BY
  year,
  month
ORDER BY
  year,
  month

为什么会出现此错误?如何避免此错误?

下面是针对BigQuery标准SQL的

#standardSQL
CREATE TEMPORARY FUNCTION getCurrentCount(month DATE) AS ((
  SELECT COUNT(DISTINCT t.by) distinct_count
  FROM `bigquery-public-data.hacker_news.full` AS t
  WHERE DATE_TRUNC(DATE(TIMESTAMP), MONTH) = month 
  AND deleted IS NOT TRUE
));
CREATE TEMPORARY FUNCTION getPreviousCount(month DATE) AS ((
  SELECT COUNT(DISTINCT t.by) distinct_count
  FROM `bigquery-public-data.hacker_news.full` AS t
  WHERE DATE_TRUNC(DATE(TIMESTAMP), MONTH) = DATE_SUB(month,INTERVAL 1 MONTH)
  AND deleted IS NOT TRUE
));
WITH easy_cohorts AS (
  SELECT t.by author,
    DATE_TRUNC(DATE(TIMESTAMP), MONTH) month
  FROM `bigquery-public-data.hacker_news.full` AS t
)
SELECT month, 
  COUNT(author) total_authors,
  getCurrentCount(month) distinct_current_authors,
  getPreviousCount(month) distinct_previous_authors
FROM easy_cohorts
GROUP BY month
ORDER BY month    

请注意:我假设您的队列逻辑是正确的,并且符合您的要求。因此,我只修复了“检索”当前月份和上个月的不同计数

如果从年份中减去
1
,然后使用相等值会怎么样?您可能需要在int64和string之间进行转换。我在问题中可能没有明确说明,但我希望计算当前月份的计数,然后计算到目前为止的所有前几个月的计数;不仅仅是最近的前一个月。你建议怎么做?不,我问的是如何“找回前几个月”。我可以看出快速阅读这篇文章可能会让人困惑,但我没有要求“检索上个月”,这是这个答案的基础。因此,我相信我的问题目前仍然有效。我会在有时间的时候重新考虑我的答案。