Size: a a a

ClickHouse не тормозит

2021 January 23

A

Alexandr in ClickHouse не тормозит
Mishanya
Хотя в вашем варианте может быть тоже самое получится, надо потестить
не уверен, что с JOIN будет быстрее - оно немного тормознутой
источник

МШ

Михаил Ш in ClickHouse не тормозит
Подскажите пожалуйста. Есть таблица заказов - номер, сумма, дата заказа, дата выкупа. Примерно так table test (orderid UInt32, cost UInt32, orderdate Date, saledate Date)
Нужно построить выборку где для каждой даты будет указано число созданных заказов, число выкупленных заказов, суммы заказов и суммы выкупов.
Пока решаю через запрос с суммированием двух объединенных выборок, т.е. нечто  типа
select date, sum(orders), sum(orderssum), sum(sells), sum(sellssum)
from (
select orderdate as date, count(1) as orders, sum(cost) as orderssum, 0 as sells, 0 as sellssum from test group by orderdate
union all
select saledate as date, 0, 0, count(1), sum(cost) from test group by saledate)
group by date
Работает, но таблица читается дважды, от этого хотелось бы избавиться. Может быть вы знаете метод, который бы мне помог избежать двойного чтения таблицы?
источник

AS

Aleksey Studnev ( bi... in ClickHouse не тормозит
Михаил Ш
Подскажите пожалуйста. Есть таблица заказов - номер, сумма, дата заказа, дата выкупа. Примерно так table test (orderid UInt32, cost UInt32, orderdate Date, saledate Date)
Нужно построить выборку где для каждой даты будет указано число созданных заказов, число выкупленных заказов, суммы заказов и суммы выкупов.
Пока решаю через запрос с суммированием двух объединенных выборок, т.е. нечто  типа
select date, sum(orders), sum(orderssum), sum(sells), sum(sellssum)
from (
select orderdate as date, count(1) as orders, sum(cost) as orderssum, 0 as sells, 0 as sellssum from test group by orderdate
union all
select saledate as date, 0, 0, count(1), sum(cost) from test group by saledate)
group by date
Работает, но таблица читается дважды, от этого хотелось бы избавиться. Может быть вы знаете метод, который бы мне помог избежать двойного чтения таблицы?
Почему UNION а не JOIN BY date ?
источник

МШ

Михаил Ш in ClickHouse не тормозит
join показался более тяжелым, в любом случае, если правильно понимаю - join не поможет избежать второго чтения таблицы
источник

AC

Alexey Churkin in ClickHouse не тормозит
Михаил Ш
Подскажите пожалуйста. Есть таблица заказов - номер, сумма, дата заказа, дата выкупа. Примерно так table test (orderid UInt32, cost UInt32, orderdate Date, saledate Date)
Нужно построить выборку где для каждой даты будет указано число созданных заказов, число выкупленных заказов, суммы заказов и суммы выкупов.
Пока решаю через запрос с суммированием двух объединенных выборок, т.е. нечто  типа
select date, sum(orders), sum(orderssum), sum(sells), sum(sellssum)
from (
select orderdate as date, count(1) as orders, sum(cost) as orderssum, 0 as sells, 0 as sellssum from test group by orderdate
union all
select saledate as date, 0, 0, count(1), sum(cost) from test group by saledate)
group by date
Работает, но таблица читается дважды, от этого хотелось бы избавиться. Может быть вы знаете метод, который бы мне помог избежать двойного чтения таблицы?
Сначала неправильно понял. Судя по всему вам поможет функция arrayJoin (https://clickhouse.tech/docs/ru/sql-reference/functions/array-join/)
источник

МШ

Михаил Ш in ClickHouse не тормозит
да, думал о ней, и вероятно мне нужно как раз что то около нее, но пока не складывается в голове, как именно ее можно было бы использовать для данного случая
источник

AC

Alexey Churkin in ClickHouse не тормозит
Михаил Ш
да, думал о ней, и вероятно мне нужно как раз что то около нее, но пока не складывается в голове, как именно ее можно было бы использовать для данного случая
Ну что-то вроде select arrayJoin([orderdate, saledate]) as date, cost from test и все это засунуть в подзапрос
источник

МШ

Михаил Ш in ClickHouse не тормозит
хммм, кажется истина где то рядом, пойду додумывать, спасибо!
источник

D

Dj in ClickHouse не тормозит
Alex Moshinets
Можно подробнее, пример запроса? Я сейчас с такой проблемой столкнулся, хочу увидеть решение через селф
чем вас вариант с аргМакс не устраивает?
источник

D

Dj in ClickHouse не тормозит
Alexandr
Select * from table PREWHERE (uniq, ver) in (select uniq, max(ver) from table group by uniq)
и вас тоже
>чем вас вариант с аргМакс не устраивает?
источник

A

Alexandr in ClickHouse не тормозит
Dj
и вас тоже
>чем вас вариант с аргМакс не устраивает?
через argmax прийдётся все поля в group засунуть, а они могут изменяться. Возможно есть другой вариант. Если возможно - покажите плз. пример ?
источник

VN

Viacheslav Nefedov in ClickHouse не тормозит
Alexandr
через argmax прийдётся все поля в group засунуть, а они могут изменяться. Возможно есть другой вариант. Если возможно - покажите плз. пример ?
источник

AP

Alexander Petrov in ClickHouse не тормозит
Михаил Ш
хммм, кажется истина где то рядом, пойду додумывать, спасибо!
Что-то вроде этого должно подойти: https://gist.github.com/aopetrov86/7a4c4489166055329191c194f58572c8
источник

D

Dj in ClickHouse не тормозит
Alexandr
через argmax прийдётся все поля в group засунуть, а они могут изменяться. Возможно есть другой вариант. Если возможно - покажите плз. пример ?
не надо все поля в груп... только ключи, а остальные поля как argmax()
источник

МШ

Михаил Ш in ClickHouse не тормозит
Спасибо! Сделал чуть иначе - вот так получилось
select a.1 as data, sum(a.2) as ordersCount, sum(a.3) as ordersSum, sum(a.4) as sellsCount, sum(a.5) as sellsSum
from (
select arrayJoin([tuple(order_date, 1, orderSum, 0, 0), tuple(sale_date, 0, 0, 1, sellSum)]) as a
from test
) group by data

т.е. в arrayJoin собираем таплы, уровнем выше их разворачиваем и суммируем
источник

A

Alexandr in ClickHouse не тормозит
Спасибо! сейчас поковыряю!
источник

A

Alexandr in ClickHouse не тормозит
Dj
не надо все поля в груп... только ключи, а остальные поля как argmax()
Спасибо!
источник

AP

Alexander Petrov in ClickHouse не тормозит
Михаил Ш
Спасибо! Сделал чуть иначе - вот так получилось
select a.1 as data, sum(a.2) as ordersCount, sum(a.3) as ordersSum, sum(a.4) as sellsCount, sum(a.5) as sellsSum
from (
select arrayJoin([tuple(order_date, 1, orderSum, 0, 0), tuple(sale_date, 0, 0, 1, sellSum)]) as a
from test
) group by data

т.е. в arrayJoin собираем таплы, уровнем выше их разворачиваем и суммируем
Ну мой вариант почитабильнее вроде, а вот какой из них быстрее и меньше ресурсов ест - хз.
источник

МШ

Михаил Ш in ClickHouse не тормозит
сначала Вашего варианта испугался, теперь понял, в чем соль, попробую, еще раз спасибо!
источник

D

Dj in ClickHouse не тормозит
Alexander Petrov
Ну мой вариант почитабильнее вроде, а вот какой из них быстрее и меньше ресурсов ест - хз.
argMax чтение с диска в один проход, если дубликатов мало %, будет лучше... если подзапрос вычистит большой процент дупликатов - он лучше
источник