Запросите как ежедневные агрегаты, так и ежемесячные агрегаты в одном запросе? - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы посчитать количество ежедневных уникальных активных пользователей по subreddit и дню, а затем агрегировать эти подсчеты на ежемесячных уникальных активных пользователей по группам и месяцам. Выполнение каждого из них по отдельности достаточно просто, но когда я пытаюсь выполнить их в одном комбинированном запросе, это говорит мне, что мне нужно сгруппировать по date_month_day в моем подзапросе второго уровня, что приведет к тому, что month_unique_users будет таким же, как daily_unique_uauthors .. ( Ошибка: выражение «date_month_day» отсутствует в списке GROUP BY [invalidQuery]).

Вот мой запрос:

SELECT * FROM
          (
              SELECT *,
                 (daily_unique_authors/monthly_unique_authors) * 1.0 AS ratio,
                 ROW_NUMBER() OVER (PARTITION BY date_month_day ORDER BY ratio DESC) rank 
                 FROM 
                     (
                      SELECT subreddit,
                            date_month_day,
                            daily_unique_authors,
                            SUM(daily_unique_authors) AS monthly_unique_authors,
                            LEFT(date_month_day, 7) as date_month
                            FROM 
                                  (
                                    SELECT subreddit,
                                           LEFT(DATE(SEC_TO_TIMESTAMP(created_utc)), 10) as date_month_day,
                                           COUNT(UNIQUE(author)) as daily_unique_authors
                                    FROM TABLE_QUERY([fh-bigquery:reddit_comments], "table_id CONTAINS \'20\' AND LENGTH(table_id)<8")
                                    GROUP EACH BY subreddit, date_month_day
                                  )
                            GROUP EACH BY subreddit, date_month))

     WHERE rank <= 100
     ORDER BY date_month ASC

Конечный результат в идеале должен выглядеть примерно так:

subreddit date_month date_month_day daily_unique_users         monthly_unique_users ratio  

 1 google 2005-12    2005-12-29                       77                    600     0.128     
 2 google 2005-12    2005-12-31                       52                     600     0.866    
 3 google 2005-12    2005-12-28                       81                     600     0.135    
 4 google 2005-12    2005-12-27                       73                     600     0.121     

1 Ответ

0 голосов
/ 14 ноября 2018

Ниже для BigQuery Standard SQL

#standardSQL
SELECT * FROM (
  SELECT *,
    ROW_NUMBER() OVER(PARTITION BY date_month_day ORDER BY ratio DESC) rank 
  FROM (
    SELECT 
      daily.subreddit subreddit, 
      daily.date_month date_month, 
      date_month_day, 
      daily_unique_authors, 
      monthly_unique_authors,
      1.0 * daily_unique_authors / monthly_unique_authors AS ratio
    FROM (
      SELECT subreddit,
        DATE(TIMESTAMP_SECONDS(created_utc)) AS date_month_day,
        FORMAT_DATE('%Y-%m', DATE(TIMESTAMP_SECONDS(created_utc))) AS date_month,
        COUNT(DISTINCT author) AS daily_unique_authors
      FROM `fh-bigquery.reddit_comments.2018*`
      GROUP BY subreddit, date_month_day, date_month
    ) daily
    JOIN (
      SELECT subreddit,
        FORMAT_DATE('%Y-%m', DATE(TIMESTAMP_SECONDS(created_utc))) AS date_month,
        COUNT(DISTINCT author) AS monthly_unique_authors
      FROM `fh-bigquery.reddit_comments.2018*`
      GROUP BY subreddit, date_month
    ) monthly 
    ON daily.subreddit = monthly.subreddit
    AND daily.date_month = monthly.date_month
  )
)
WHERE rank <= 100
ORDER BY date_month

Примечание: я пытался оставить как можно больше исходной логики и структуры в вопросе, чтобы ФП мог соотнести ответ с вопросом и внести дополнительные корректировки, если это необходимо: o)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...