bigquery 创建间隔 15 分钟的时间戳存储桶

问题描述 投票:0回答:2

我想实现这个:

输出

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。

sql google-bigquery timestamp
2个回答
0
投票

使用 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


0
投票

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

边界问题可能会发挥作用。例如,如果您的存储桶标识符包含年、月和日,可能会更清晰,以避免意外聚合不同日期的订单。您可能还想告知用户,计数包括截至但不包括存储桶标识符中的结束时间戳的订单。

© www.soinside.com 2019 - 2024. All rights reserved.