DESCRIPTION > Inspired by DUB implementation NODE dayIntervals SQL > % WITH toStartOfDay( parseDateTime64BestEffort({{ String(start, '2024-11-01T00:00:00.000Z') }}, 3) ) AS start, toStartOfDay(parseDateTime64BestEffort({{ String(end, '2024-11-02T00:00:00.000Z') }}, 3)) AS end SELECT arrayJoin( arrayMap( x -> toDateTime64(toStartOfDay(toDateTime64(x, 3)), 3), range(toUInt32(start + 86400), toUInt32(end + 86400), 86400 ) ) ) as interval NODE hourIntervals SQL > % WITH toStartOfHour( parseDateTime64BestEffort({{ String(start, '2024-11-01T00:00:00.000Z') }}, 3) ) AS start, toStartOfHour(parseDateTime64BestEffort({{ String(end, '2024-11-02T00:00:00.000Z') }}, 3)) AS end SELECT arrayJoin( arrayMap(x -> toDateTime64(x, 3), range(toUInt32(start + 3600), toUInt32(end + 3600), 3600) ) ) as interval NODE selectIntervalByGranularity SQL > % SELECT * FROM {% if granularity == "hour" %} hourIntervals {% else %} dayIntervals {% end %} NODE timeSeriesServerlessFunctionDurationData SQL > % SELECT {% if granularity == "hour" %} toStartOfHour(timestamp) {% else %} toDateTime64(toStartOfDay(timestamp), 3) {% end %} AS interval, avg(CAST(durationInMs AS Float64)) as average, min(durationInMs) as minimum, max(durationInMs) as maximum FROM serverlessFunctionEventMV WHERE true AND workspaceId ={{ String(workspaceId, '20202020-1c25-4d02-bf25-6aeccf7ea419', required=True) }} AND functionId = {{ String(functionId, 'a9fd87c0-af86-4e17-be3a-a6d3d961678a', required=True) }} AND timestamp >= parseDateTime64BestEffort({{ String(start, '2024-11-01T00:00:00.000Z') }}, 3) AND timestamp < parseDateTime64BestEffort({{ String(end, '2024-11-02T00:00:00.000Z') }}, 3) GROUP BY interval ORDER BY interval NODE endpoint SQL > % SELECT formatDateTime(interval, '%FT%T.000%z') as start, minimum, maximum, average FROM selectIntervalByGranularity LEFT JOIN timeSeriesServerlessFunctionDurationData USING interval