Давайте построим эту визуализацию:
Запрос, подобный этому, будет делать - этот получает количество сообщений на / r / AmITheAsshole, упорядоченное по наиболее типичному суждению:
SELECT link_flair_text, COUNT(*) c
FROM `fh-bigquery.reddit_posts.2019_08`
WHERE subreddit = 'AmItheAsshole'
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1000
Чтобы запросить данные за несколько месяцев, вы можете использовать *
на FROM
:
SELECT link_flair_text, COUNT(*) c
FROM `fh-bigquery.reddit_posts.2019_*`
WHERE subreddit = 'AmItheAsshole'
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1000
И, чтобы увидеть эволюцию в процентах в месяц:
SELECT link_flair_text, ARRAY_AGG(STRUCT(month, ROUND(100*c/total_month,1) AS perc, c) ORDER BY month) AS arr
FROM (
SELECT *, SUM(c) OVER(PARTITION BY month) total_month
FROM (
SELECT link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
FROM `fh-bigquery.reddit_posts.2019_*`
WHERE subreddit = 'AmItheAsshole'
AND link_flair_text IS NOT NULL
GROUP BY 1,2
HAVING c > 100
)
)
GROUP BY 1
ORDER BY SUM(c) DESC
И SQL для визы, показанной выше:
CREATE OR REPLACE TABLE `temp.assholes`
AS
SELECT *, c/total_month AS perc
FROM (
SELECT *, SUM(c) OVER(PARTITION BY month) total_month, SUM(c) OVER(PARTITION BY link_flair_text) total_flair
FROM (
SELECT LOWER(link_flair_text) link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
FROM `fh-bigquery.reddit_posts.201*`
WHERE subreddit = 'AmItheAsshole'
AND link_flair_text IS NOT NULL
AND _table_suffix >= '8_03'
GROUP BY 1,2
)
)
WHERE c/total_month > 0.01
AND total_flair > 1000
ORDER BY month
Как доставить данные до 2016 года?
Почти тот же запрос, но он включает в себя другую таблицу, в которой содержится все содержимое c истории до 2016 года:
WITH data AS (
SELECT * FROM `fh-bigquery.reddit_posts.201*` WHERE _table_suffix >= '5_12'
UNION ALL
SELECT * FROM `fh-bigquery.reddit_posts.full_corpus_201512`
)
SELECT *, c/total_month AS perc
FROM (
SELECT *, SUM(c) OVER(PARTITION BY month) total_month, SUM(c) OVER(PARTITION BY link_flair_text) total_flair
FROM (
SELECT LOWER(link_flair_text) link_flair_text, DATE(TIMESTAMP_TRUNC(TIMESTAMP_SECONDS(created_utc), MONTH)) month, COUNT(*) c
FROM data
WHERE subreddit = 'AmItheAsshole'
AND link_flair_text IS NOT NULL
GROUP BY 1,2
)
)
WHERE c/total_month > 0.01
AND total_flair > 1000
ORDER BY month