Подсчитайте количество случаев, в которых одно значение одинаково, а другое - нет - PullRequest
1 голос
/ 12 марта 2020

У меня есть ситуация, когда пользовательские просмотры и клики по баннеру происходят с разных ip. Я регистрирую идентификатор сессии - текущий сеанс просмотра страницы. И я хочу посчитать, сколько кликов за один сеанс не соответствует ip просмотров.

Существующие данные:

date          view click    session_id          ip 
------------------------------------------------------
"2020-02-03"   1     0        111111           8.8.8.8
"2020-02-03"   0     1        111111           4.4.4.4
"2020-02-04"   1     0        222222           9.9.9.9
"2020-02-04"   0     1        222222           9.9.9.9
"2020-02-05"   1     0        333333           10.10.10.10
"2020-02-05"   0     1        333333           11.11.11.11
"2020-02-05"   1     0        444444           12.12.12.12
"2020-02-05"   0     1        444444           13.13.13.13
"2020-02-05"   1     0        555555           14.14.14.14

Ожидаемый результат:

date           same_session_but_different_ip_count
---------------------------------------------------
"2020-02-03"   1
"2020-02-04"   0
"2020-02-05"   2

Мой способ состоял в том, чтобы записать все сеансы просмотра за месяц в переменную $view_sessions и все просмотры ip в переменная $view_ip и считать следующим образом:

SELECT 
    date, count(*)
FROM Table 

WHERE
    date >="2020-02-01" and date<="2020-02-31"
    click = 1 and
    session_id in $view_sessions and
    ip not in $view_ip
group by
    date
order by count(*)

Есть ли более изящный способ решения этой задачи?

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Вы можете сделать агрегацию:

select date, sum(case when mn_ip = mx_ip and mn_act <> mx_act then 1 else 0 end) as same_session_but_different_ip_count
from (select date, min(action) as mn_act, max(action) as mx_act, 
             min(ip) as mn_ip, max(ip) as mx_id
      from table t
      where date >= '2020-02-01' and date <= '2020-02-31'
      group by date, session
     ) t
group by date;
1 голос
/ 12 марта 2020

Я думаю, вы хотите два уровня агрегации. Предполагая, что у вас есть только один щелчок и просмотр (как в примере данных):

SELECT date, SUM(CASE WHEN click_ip <> view_ip THEN 1 ELSE 0 END)
FROM (SELECT date, session_id,
             MAX(CASE WHEN action = 'click' THEN ip END) as click_ip,
             MAX(CASE WHEN action = 'view' THEN ip END) as view_ip
      FROM Table 
      WHERE date >= '2020-02-01' and date <= '2020-02-31'
      GROUP BY date, session_id
     ) t
GROUP BY date;
...