Подсчет записей строк в таблице BigQuery, сгруппированных по временному интервалу с использованием SQL

# #sql #datetime #time #group-by #google-bigquery

Вопрос:

Я зашел в тупик с этим вопросом BigQuery/SQL. После ~1 часа поиска в Гугле я все еще не понял этого, поэтому решил спросить здесь.

У меня есть большая таблица запросов (mycompany.engagement.product_orders) данных о заказах клиентов. Каждая строка в таблице описывает заказ, размещенный клиентом, и выглядит это примерно так:

Ряд Продукт Отметка времени Тип Имя пользователя
1 Apple 2021-08-19 11:41:08.874 UTC Праздничный Филипп Кан
2 Оранжевый 2021-08-19 11:41:12.874 UTC Пупок Грейс Хоппер
3 Груша 2021-08-19 11:41:24.874 UTC Боск Владимир Набоков
4 Apple 2021-08-19 11:41:47.874 UTC Мелба Сильвия Плат
5 Груша 2021-08-19 11:41:55.874 UTC Анжу Алан Тьюринг
6 Груша 2021-08-19 11:42:10.874 UTC Азиатская Сильвия Плат
7 Apple 2021-08-19 11:42:11.874 UTC Фудзи Владимир Набоков
8 Оранжевый 2021-08-19 11:42:37.874 UTC Кровь Ада Лавлейс
9 Оранжевый 2021-08-19 11:42:49.874 UTC Cara Грейс Хоппер
10 Apple 2021-08-19 11:42:51.874 UTC Мелба Алан Тьюринг

Я хотел бы сформулировать SQL-запрос, который будет подсчитывать продукты, заказанные клиентами с интервалом в 1 минуту (или с любым интервалом на самом деле), чтобы вернуть таблицу, которая выглядит (что-то) примерно так:

Ряд Продукт Отметка времени Рассчитывать
1 Apple 2021-08-19 11:41:00.000 UTC 2
2 Оранжевый 2021-08-19 11:41:00.000 UTC 1
3 Груша 2021-08-19 11:41:00.000 UTC 2
4 Груша 2021-08-19 11:42:00.000 UTC 1
5 Apple 2021-08-19 11:42:00.000 UTC 2
6 Оранжевый 2021-08-19 11:42:00.000 UTC 2

Несколько заметок:

Примеры, которые я нашел, были релевантными (например: https://dba.stackexchange.com/questions/179823/grouping-count-by-interval-of-15-minutes), как правило, предоставляют подсчеты для всех записей строк, а не агрегируются по значению столбца приращения. Я знаю, что это может быть возможно с помощью операторов partition by или group by, но я не совсем уверен, или как бы я структурировал их вместе. Если это невозможно, было бы здорово знать — мои навыки SQL все еще довольно зарождаются.

Попытка: Следуя структуре ссылки, опубликованной выше, которая несколько похожа на мою:

 SELECT 
    DATE_ADD(MINUTE, (DATEDIFF(MINUTE, '20000101', timestamp) / 1)*1, '20000101'),
    count(*)
FROM 
    mycompany.engagement.product_orders
GROUP BY
    DATE_ADD(MINUTE, (DATEDIFF(MINUTE, '20000101', timestamp) / 1)*1, '20000101')
 

ВОЗВРАТ:

 Unrecognized name: MINUTE at [2:14]

 

Ответ №1:

Рассмотрим следующий подход

 select Product, 
  timestamp_trunc(Timestamp, minute) Timestamp,
  count(1) `Count`
from `mycompany.engagement.product_orders`
group by 1, 2        
 

если применить к образцам данных в вашем вопросе — вывод будет

введите описание изображения здесь

Комментарии:

1. рад, что это сработало для тебя. подумайте также о том, чтобы проголосовать за ответ, если это помогло :o)

Ответ №2:

Вы хотите использовать date_trunc() :

 SELECT DATE_TRUNC(timestamp, MINUTE) as tm,
       COUNT(*)
FROM  mycompany.engagement.product_orders
GROUP BY tm;
 

Комментарии:

1. Спасибо за быстрый ответ! Мне пришлось немного изменить этот запрос (без запятой): ` ВЫБЕРИТЕ DATE_TRUNC(метка времени, МИНУТА) в качестве tm, ПОДСЧЕТ(*) ИЗ ГРУППЫ mycompany.engagement.product_orders ПО tm; ` » Но теперь как я могу подсчитать количество вхождений в каждый минутный интервал, сгруппированный по продукту?