# #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; ` » Но теперь как я могу подсчитать количество вхождений в каждый минутный интервал, сгруппированный по продукту?