Отрицание равенства во временной функции WHERE вызывает ошибку соединения

Я пытаюсь подсчитать отдельных пользователей, которые также соответствуют условию (в этом примере deleted IS NOT TRUE). Мне нужно сгруппировать по ежемесячным когортам пользователей, которые были активны в течение целевого месяца, и пользователей, которые были активны в предыдущие месяцы.

Чтобы получить предыдущие месяцы, я использую отрицательное равенство (FORMAT_DATE('%Y%m', DATE(timestamp)) != CONCAT(year, month)), но когда я это делаю, я получаю сообщение «Ошибка: LEFT OUTER JOIN нельзя использовать без условия, которое является равенством полей с обеих сторон соединения». Использование равенства без отрицания выполняется успешно.

Я просмотрел это и это но оба эти вопроса в контексте использования явного JOIN.

Приведенный ниже код воспроизводит проблему и может быть выполнен в веб-консоли BigQuery.

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

Почему я получаю эту ошибку и как ее обойти?


person willem-h    schedule 14.06.2018    source источник
comment
Что, если вычесть 1 из года, а затем использовать равенство? Возможно, вам придется выполнить приведение между int64 и строкой.   -  person Elliott Brossard    schedule 14.06.2018


Ответы (1)


Ниже приведен стандартный SQL BigQuery.

#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    

Обратите внимание: я предполагаю, что ваша когортная логика верна и соответствует вашим требованиям. Поэтому я исправил только «извлечение» текущего месяца и предыдущего месяца.

person Mikhail Berlyant    schedule 14.06.2018
comment
Возможно, я не ясно дал понять в своем вопросе, но мне нужен счет за текущий месяц, а затем счет за все предыдущие месяцы на сегодняшний день; не только самый последний предыдущий месяц. Как бы предложил это сделать? - person willem-h; 18.06.2018
comment
Нет, я спросил, как получить предыдущие месяцы. Я вижу, как быстрое чтение может сбить с толку, но я не просил получить предыдущий месяц, который является основой этого ответа. Поэтому я считаю, что мой вопрос все еще актуален в его нынешнем виде. - person willem-h; 18.06.2018
comment
Я пересмотрю свой ответ, когда будет время. - person Mikhail Berlyant; 18.06.2018