SQL: сжатие повторных COUNTIF: - PullRequest
       6

SQL: сжатие повторных COUNTIF:

0 голосов
/ 24 октября 2018

В этом (BigQuery) запросе:

SELECT user_first_touch_date, 
   COUNT(*) as total,
   COUNTIF(active_days >= 1) as active_1d,
   COUNTIF(active_days >= 2) as active_2d,
   COUNTIF(active_days >= 3) as active_3d,
   COUNTIF(active_days >= 4) as active_4d,
   COUNTIF(active_days >= 5) as active_5d,
   COUNTIF(active_days >= 6) as active_6d,
   COUNTIF(active_days >= 7) as active_7d
FROM `device_event_count` 
GROUP BY user_first_touch_date
ORDER BY user_first_touch_date

У меня много шаблонных COUNTIF утверждений.(И если бы я хотел посмотреть на 14 или 28 дней, это было бы намного хуже.) Есть ли способ написать этот запрос более компактно?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вдохновленный ответом Михаила Берлянта здесь Я создал запрос, который выдает запрос, который вам нужен.Стандартный SQL, конечно.

with device_event_count as (select * from
(select '2015-08-01' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 2 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 3 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 2 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 2 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 5 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 7 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 3 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 5 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 6 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 7 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 3 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 2 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 3 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 2 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 1 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 21 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 53 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 72 as active_days) union all
(select '2015-08-01' as user_first_touch_date, 3 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 11 as active_days) union all
(select '2015-08-02' as user_first_touch_date, 62 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 73 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 34 as active_days) union all
(select '2015-08-03' as user_first_touch_date, 4 as active_days)
)
select concat('select user_first_touch_date, COUNT(*) as total, ' ,
string_agg( concat('COUNTIF(active_days >=',  safe_cast(active_days as string) , ') as active_' , safe_cast(active_days as string),'d'),','),' 
from `device_event_count` group by user_first_touch_date order by user_first_touch_date')
from (select active_days from device_event_count group by active_days order by active_days)

и вот что он возвращает:

select user_first_touch_date, COUNT(*) as total, COUNTIF(active_days >=1) as active_1d,COUNTIF(active_days >=2) as active_2d,COUNTIF(active_days >=3) as active_3d,COUNTIF(active_days >=4) as active_4d,COUNTIF(active_days >=5) as active_5d,COUNTIF(active_days >=6) as active_6d,COUNTIF(active_days >=7) as active_7d,COUNTIF(active_days >=11) as active_11d,COUNTIF(active_days >=21) as active_21d,COUNTIF(active_days >=34) as active_34d,COUNTIF(active_days >=53) as active_53d,COUNTIF(active_days >=62) as active_62d,COUNTIF(active_days >=72) as active_72d,COUNTIF(active_days >=73) as active_73 from `device_event_count` group by user_first_touch_date order by user_first_touch_date

результат enter image description here

0 голосов
/ 24 октября 2018

Единственный обходной путь, который я вижу, - это «автоматизировать» создание вашего запроса - здесь так много примеров на SO, - по крайней мере, я знаю, что дал несколько таких ответов - вы можете выполнить быстрый поиск.Грубо говоря:
Вариант 1 - полуручный - есть служебный запрос, который генерирует текст необходимого запроса с таким количеством «лишних» строк, сколько вам нужно, а затем принимает вывод и запускает его как запрос;
Вариант 2 - используетклиент по вашему выбору и все бежать в один выстрел

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...