我想实现这个:
输出
12:00:00 - 12:15:00
12:15:00 - 12:30:00
12:30:00 - 12:45:00
12:45:00 - 1:00:00 .......,
count(orders)
from table
我在数据表中有一个可用的时间戳(2022-07-05 19:45:00 UTC),我想在一天内每 15 分钟间隔实现#orders。
使用 RANGE_BUCKET 函数,您可以每 15 分钟创建一个时间戳桶。考虑下面的示例查询:
CREATE TEMP TABLE sample_table AS
SELECT * FROM UNNEST(GENERATE_TIMESTAMP_ARRAY('2022-07-05 00:00:00', '2022-07-05 10:00:00', INTERVAL 3 MINUTE)) `order`
;
SELECT TIMESTAMP_SECONDS(intervals[SAFE_OFFSET(RANGE_BUCKET(UNIX_SECONDS(`order`), intervals) - 1)]) ts,
COUNT(`order`) AS orders,
FROM `sample_table`,
UNNEST ([STRUCT(GENERATE_ARRAY(UNIX_SECONDS('2022-07-05'), UNIX_SECONDS('2022-07-06'), 60 * 15) AS intervals)])
GROUP BY 1
ORDER BY 1
case 表达式可以根据每行的时间戳创建满足您需求的存储桶标识符。然后,您可以按存储桶标识符进行分组以计算每个存储桶中的行数。
WITH
fake_order_details AS (SELECT "some value" AS order_detail),
orders AS (SELECT * FROM UNNEST(GENERATE_TIMESTAMP_ARRAY('2023-11-27 00:00:00', '2023-11-28 00:59:00', INTERVAL 1 MINUTE)) AS order_timestamp
CROSS JOIN fake_order_details)
SELECT
CASE
WHEN EXTRACT(minute FROM order_timestamp) BETWEEN 0 AND 14 THEN FORMAT("%d-%02d-%02d %02d:00:00 - %d-%02d-%02d %02d:15:00", EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp), EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp))
WHEN EXTRACT(minute FROM order_timestamp) BETWEEN 15 AND 29 THEN FORMAT("%d-%02d-%02d %02d:15:00 - %d-%02d-%02d %02d:30:00", EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp), EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp))
WHEN EXTRACT(minute FROM order_timestamp) BETWEEN 30 AND 44 THEN FORMAT("%d-%02d-%02d %02d:30:00 - %d-%02d-%02d %02d:45:00", EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp), EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp))
WHEN EXTRACT(minute FROM order_timestamp) BETWEEN 45 AND 59 THEN FORMAT("%d-%02d-%02d %02d:45:00 - %d-%02d-%02d %02d:00:00", EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM order_timestamp), EXTRACT(year FROM order_timestamp), EXTRACT(month FROM order_timestamp), EXTRACT(day FROM order_timestamp), EXTRACT(hour FROM
-- extract hour from a timestamp one hour later
TIMESTAMP_ADD(order_timestamp, INTERVAL 1 hour)))
ELSE "Unexpected timestamp"
END AS order_timestamp_bucket,
COUNT(*) AS order_count
FROM orders
GROUP BY order_timestamp_bucket
ORDER BY order_timestamp_bucket
边界问题可能会发挥作用。例如,如果您的存储桶标识符包含年、月和日,可能会更清晰,以避免意外聚合不同日期的订单。您可能还想告知用户,计数包括截至但不包括存储桶标识符中的结束时间戳的订单。