Последнее время проводил эксперименты с группировками в Кликхаусе - cube() и grouping sets()
Интересно было попробовать как-то сагрегировать уникальных клиентов в разных разрезах и все это соединить с датами используя куб/сет
Плюсом к этому нашел интересный способ чем-то заменить UNION
В комментах на LinkedIn подсказали классный способ использования least(), теперь им тоже часто пользуюсь, для определения, что все значения меньше какого-либо числа
в этот раз в 5ть слайдов не уложился)
Полный код:
```
with
fruit_group as (
select
toStartOfMonth(Date) as Month
, toStartOfWeek(Date, 1) as Week
, ClientType
, Fruits
, count(distinct ClientId) as UnicClient
, sum(FruitsCount) as FruitsCount
, case
when grouping(Month, ClientType) = 0
then 'Тип Клиента'
when grouping(Month, Fruits) = 0
then 'Вид Фрукта'
when least(grouping(Month, ClientType)
, grouping(Month, Fruits)
) > 0 then 'Total'
end GroupType
, coalesce(
ifNull(ClientType, Null)
, ifNull(Fruits, Null)
, 'Total'
) as GroupParam
from fruit
Group by GROUPING SETS (
(Month, ClientType),
( Month, Fruits),
( Month),
( Week, ClientType),
( Week, Fruits),
( Week)
)),
pred_columns as (
select
arrayJoin(
arrayFilter(x -> x.1 >'1970-01-01', [
(Month, 'Month', GroupType, GroupParam, UnicClient, FruitsCount),
(Week, 'Week', GroupType, GroupParam, UnicClient, FruitsCount)
])
) as t
from fruit_group)
select
t.1 as Date
, t.2 as DateType
, t.3 as GroupType
, t.4 as GroupParam
, t.5 as UnicClient
, t.6 as FruitsCount
from pred_columns
```