Size: a a a

ClickHouse не тормозит

2021 July 02

CU

Caside Ultra in ClickHouse не тормозит
Помогите пожалуйста, есть подзапрос, в каждой строке уникальный id, start_date, end_date (даты с первыми днями месяцев). Нужно сделать запрос, в котором на каждый id будет столько строк с датами, сколько месяцев между start_date и end_date.

Не совсем понимаю как в этом случае использовать numbers.
источник

DB

Denis Bazhenov in ClickHouse не тормозит
Мне кажется, в этой задаче проще для каждой строчки сформировать массив длины равной количеству месяцев м/у start_date и end_date, а потом использовать ARRAY JOIN.
источник

S

Slach in ClickHouse не тормозит
вам для отчета какого то надо?
источник

CU

Caside Ultra in ClickHouse не тормозит
да, чтобы потом по id джойнить другие колонки и протягивать по месяцам
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
SELECT
   id,
   arrayJoin(arrayMap(i -> (toStartOfMonth(b) + toIntervalMonth(i)), range(toUInt64(toYYYYMM(e) - toYYYYMM(b))))) AS m
FROM
(
   SELECT
       1 AS id,
       toDate('2021-01-01') AS b,
       toDate('2021-06-01') AS e
)

┌─id─┬──────────m─┐
│  1 │ 2021-01-01 │
│  1 │ 2021-02-01 │
│  1 │ 2021-03-01 │
│  1 │ 2021-04-01 │
│  1 │ 2021-05-01 │
└────┴────────────┘


https://kb.altinity.com/altinity-kb-queries-and-syntax/join-with-calendar-using-arrays
источник

CU

Caside Ultra in ClickHouse не тормозит
Звучит разумно, но я получаю эксепшн:
Nested type Array(UInt64) cannot be inside Nullable type: While processing agreement_id, arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(toUInt64(toYYYYMM(end_date) - toYYYYMM(start_date))))) AS month (version 21.6.5.37 (official build))

Возможно это из-за того, что мои start_date и end_date Nullable(DateTime)?
источник

DC

Denny Crane [not a Y... in ClickHouse не тормозит
вместо toUInt64 ( )  надо cast( a - b, 'UInt64' )
источник

CU

Caside Ultra in ClickHouse не тормозит
arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(CAST(toYYYYMM(end_date) - toYYYYMM(start_date),'UInt64')))) AS m


Code: 69, e.displayText() = DB::Exception: A call to function range overflows, investigate the values of arguments you are passing: while executing 'FUNCTION range(CAST(minus(end_date, start_date), 'UInt64') :: 2) -> range(CAST(minus(end_date, start_date), 'UInt64')) Array(UInt64) : 4' (version 21.6.5.37 (official build))

Не понимаю в чём ошибка. Можте вообще лучше dateDiff использовать внутри range? Хот тоже не помогает
источник

S

Slach in ClickHouse не тормозит
у вас может быть такое что start_date > end_date?
источник

CU

Caside Ultra in ClickHouse не тормозит
нет, такого точно не должно быть. Но интересно, я заселектил toYYYYMM(start_date) и на выходе у меня такое
2020-09-01 -> 202,009
2021-08-01 -> 202,108
источник

CU

Caside Ultra in ClickHouse не тормозит
CAST(toYYYYMM(end_date) - toYYYYMM(start_date),'UInt64') выдаёт 99 или 100, хотя между старт и энд всего 1 год
источник

CU

Caside Ultra in ClickHouse не тормозит
select    
   agreement_id,
   arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(12))) AS m

Прекрасно работает, прямо как надо. Только у меня не везде разница 12 месяцев. То что внутри рейнджа неверно считается
источник

CU

Caside Ultra in ClickHouse не тормозит
arrayJoin(arrayMap(i -> (toStartOfMonth(start_date) + toIntervalMonth(i)), range(CAST(dateDiff('month', start_date, end_date),'UInt64')))) AS m

выдаёт

A call to function range overflows, investigate the values of arguments you are passing: while executing 'FUNCTION range(CAST(dateDiff('month', start_date, end_date), 'UInt64') :: 2) -> range(CAST(dateDiff('month', start_date, end_date), 'UInt64')) Array(UInt64) : 5' (version 21.6.5.37 (official build))
источник

CU

Caside Ultra in ClickHouse не тормозит
Нашёл косяк, где-то действительно старт деёт больше энд дейта, вы правы, всем спасибо
источник

S

Slach in ClickHouse не тормозит
ну оно и должно быть числом
источник

S

Slach in ClickHouse не тормозит
источник

CZ

Ctrl Z in ClickHouse не тормозит
Кст, насчет дейтдифф - он же инт выдает, а как сделать так, чтоб он флоат выдавал? Мне нужно, чтоб выводились строки с разницей двух действий в 7 суток, но он все , что слегка больше 7 суток просто округляет до 7 дней и выдает лишнюю инфу. Или в таком случае unit = seconds сделать, чтоб разница была в N секунд за 7 суток?
источник

S

Slach in ClickHouse не тормозит
Да, делайте по секундам
dateDiff('second',end_date, start_date) <= 86400*7
источник

CZ

Ctrl Z in ClickHouse не тормозит
Благодарю)
источник

I

I C in ClickHouse не тормозит
Привет всем!
функции dictGetT больше нет в clickhouse?
хотел использовать range_hashed словарь, но кх предлагает только функцию dictGet
источник