data1
client1 event2 data2
client2 event1 data1
client2 event2 data2
client3 event1 data1
client3 event3 data3
Как можно выбрать таких клиентов, у которых есть event1 и event2 одновременно?
То есть в данном примере должны выбраться
client1 и client2
Мне кажется, вам подойдёт что-то типа hasAll(groupUniqArray(event_id), [event1, event2])
вариант через hasAll неплохой Единственное что можно еще посоветовать если позволяет логика в WHERE написать event IN ('event1', 'event2')
Немного не понял каким образом? Простой IN вернёт строчки, которые содержат хоть один из эвентов. Есть ещё вариант, конечно, делать только одну строчку на клиента, эвенты сделать массивами и обновлять строчку через Replacing или Aggregating. На самом деле у нас схема примерно такая и есть сейчас. Клиент всегда один, а собираем все его эвенты (их немного, буквально до 10, соответственно массивы тоже небольшие) и в ReplacingMergeTree храним. Интересует именно быстрота поиска. Будет быстрее смотреть на заранее составленный массив в колонке с типом array или составлять массив через groupArray и искать уже в нем?
IN позволит отбросить все неподходящие строчки -> меньше данных для агрегации -> быстрее агрегация.
То есть сейчас у нас что-то вроде client1 [event1, event2] [data1, data2] client2 [event1, event2] [data1, data2] client3 [event3, event2] [data3, data2] но это сложнее хранить и обрабатывать как отдельные эвенты
А если не сложно, можно пример запроса? Вы имеете в виду, что перед groupArray сделать фильтр по WHERE IN?
Обсуждают сегодня