Группировать по каждой строке в BigQuery - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть таблица, в которой хранятся комментарии пользователей за каждый месяц.Комментарии хранятся с использованием меток времени UTC, я хочу получить пользователей, которые публикуют более 20 комментариев в день.Я могу получить начало и конец отметки времени для каждого дня, но не могу сгруппировать таблицу комментариев по количеству комментариев.Это скрипт, который у меня есть для получения дат, временных отметок и отдельных пользователей.

SELECT
DATE(TIMESTAMP_SECONDS(r.ts_start)) AS date,
r.ts_start AS timestamp_start,
r.ts_start+86400 AS timestamp_end,
COUNT(*) AS number_of_comments,
COUNT(DISTINCT s.author) AS dictinct_authors
FROM ((
  WITH
    shifts AS (
    SELECT
      [STRUCT(" 00:00:00 UTC" AS hrs,
        GENERATE_DATE_ARRAY('2018-07-01','2018-07-31', INTERVAL 1 DAY) AS dt_range) ] AS full_timestamps )
  SELECT
    UNIX_SECONDS(CAST(CONCAT( CAST(dt AS STRING), CAST(hrs AS STRING)) AS TIMESTAMP)) AS ts_start,
    UNIX_SECONDS(CAST(CONCAT( CAST(dt AS STRING), CAST(hrs AS STRING)) AS TIMESTAMP)) + 86400 AS ts_end
  FROM
    shifts,
    shifts.full_timestamps
  LEFT JOIN
    full_timestamps.dt_range AS dt)) r
 INNER JOIN
`user_comments.2018_07` s
ON
(s.created_utc BETWEEN r.ts_start
  AND r.ts_end)
GROUP BY
r.ts_start
ORDER BY
number_of_comments DESC 

А это пример вывода 1 : enter image description here

Таблица user_comments.2018_07 выглядит следующим образом: enter image description here

Более конкретно, я хочу, чтобы первый вывод 1 содержал еще один столбец, показывающий число авторов, у которых большечем 20 комментариев на дату.Как я могу это сделать?

1 Ответ

0 голосов
/ 05 декабря 2018

Если цель состоит только в том, чтобы получить из таблицы user_comments.2018_07 количество пользователей с более чем двадцатью комментариями за каждый день и добавить его к полученному выводу, это должно упростить первый использованный запрос.Пока вы не привязаны к тому, чтобы хранить минимальные / максимальные временные метки для каждого дня.

with nb_comms_per_day_per_user as (
SELECT
day,
author,
COUNT(*) as nb_comments
FROM
# unnest as we don't really want an array
unnest(GENERATE_DATE_ARRAY('2018-07-01','2018-07-31', INTERVAL 1 DAY)) AS day
INNER JOIN `user_comments.2018_07` c
on
# directly convert timestamp to a date, without using min/max timestamp
date(timestamp_seconds(created_utc))
=
day
GROUP BY day, c.author
)

SELECT
day,
sum(nb_comments) as total_comments,
count(*) as distinct_authors, # we have already grouped by author
# sum + if enables to count "very active" users
sum(if(nb_comments > 20, 1, 0)) as very_active_users
FROM nb_comms_per_day_per_user
GROUP BY day
ORDER BY total_comments desc

Также я предположил, что комментарий к столбцу, содержащий логические значения, не используется, поскольку вы не используете его в своем первоначальном запросе

...