WITH?
Ситуация такая, что нужно сгенерировать серию интервалов времени с шагом, зависящим от размера интервала. Простой вариант запроса, с фиксированным шагом, работает:
WITH
CAST('2020-02-01 00:00:00' AS DateTime) AS date_start,
CAST('2020-02-02 00:00:00' AS DateTime) AS date_end
SELECT arrayJoin(timeSlots(date_start, toUInt32(dateDiff('second', date_start, date_end)), 3600))
Но вместо константы 3600 я бы хотел использовать кейс, определяющий длину интервала в зависимости от разницы между date_start и date_end. Грубо говоря, часовой период имеет смысл делить на минутные интервалы, а годовой - на недельные. Но с передачей функции третьим параметром timeSlots не сложилось (на примере самой простой, на самом деле вместо этого multiIf большой кейс):
WITH
CAST('2020-02-01 00:00:00' AS DateTime) AS date_start,
CAST('2020-02-02 00:00:00' AS DateTime) AS date_end,
multiIf('param_val' = 'param_val', 300, 600) AS series_interval
SELECT arrayJoin(timeSlots(date_start, toUInt32(dateDiff('second', date_start, date_end)), series_interval))
выдаёт DB::Exception: Argument at index 2 for function timeSlots must be constant
И с одной стороны я понимаю, что там по смыслу должна быть константа, но с другой - значение функции-то не меняется. Может быть кто-нибудь знает хитрый способ заставить КХ воспринимать расчитанное в WITH значение функции как константу?
есть несколько вариантов, но я бы просто сделал 4 запроса в with и создал 4 массива, годовой, месячный , ...
Обсуждают сегодня