Как использовать группу в двух подзапросах и суммировать количество строк? - PullRequest
0 голосов
/ 10 января 2019

У меня есть две разные таблицы без какого-либо отношения, но мне нужно суммировать количество строк в обоих и в группах, используя даты. Мне нужно таким образом, потому что мне нужно построить график в метабазе.

Мне нужно, чтобы подсчитать, сколько видеообъявлений мои пользователи смотрят каждый день, и, к сожалению, оно разделено.

Я попробовал этот SQL и почти работал:

select *, total_video_prize + total_video_stock
from (select last_video_watched, count(*) as total_video_prize from video_ads_user_historic group by DAY(last_video_watched)) as video_prize,
(select date_when_transacted, count(*) as total_video_stock from stock_historic where has_seen_video_ad = true group by DAY(date_when_transacted)) as video_stock

Проблема заключалась в том, что даты не были объединены. Мне нужно, чтобы last_video_watched было таким же, как date_when_transacted, сгруппированным по дням. Возможно ли это сделать?

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Каждая запись представляет просмотренный фильм, независимо от того, какая из двух таблиц. Так что склейте строки таблицы вместе с UNION ALL и посчитайте:

select dt, count(*)
from
(
  select last_video_watched as dt from video_ads_user_historic
  union all
  select date_when_transacted as dt from stock_historic where has_seen_video_ad = true
) unioned
group by dt
order by dt;

Если столбцы даты содержат часть времени, вместо простого столбца используйте DATE(column).

0 голосов
/ 10 января 2019

Я думаю, что самое простое решение - это просто union all и group by:

select date(dt), sum(is_video_prize) as total_video_prize,
       sum(is_video_stock) as total_video_stock
from ((select last_video_watched as dt, 1 as is_video_prize, 0 as is_video_stock
       from video_ads_user_historic
      ) union all
      (select date_when_transacted as dt, 0, 1
       from stock_historic
       where has_seen_video_ad = true
      )
     ) vp
group by date(dt)
order by date(dt);

Соединения не нужны.

0 голосов
/ 10 января 2019

Вы можете использовать UNION для получения дня, а затем присоединиться к подзапросу для подсчета

select  t1.my_day , t2.total_video_prize , t3.total_video_stock
from (
    select DAY(date_when_transacted) as my_day
    from  stock_historic 
    union 
    select DAY(last_video_watched)
    from video_ads_user_historic 
) t1 
left join  (

    select DAY(last_video_watched) my_day, count(*) as total_video_prize 
    from video_ads_user_historic 
    group by DAY(last_video_watched)

) t2 on t2.myday = t1.my_day

left join  (
    selectDAY(date_when_transacted) my_day, count(*) as total_video_stock 
    from stock_historic 
    where has_seen_video_ad = true 
    group by DAY(date_when_transacted)

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