Процент SQL между таблицами - PullRequest
1 голос
/ 28 сентября 2019

У меня есть вопрос SQL, который я изо всех сил пытался выяснить.

Предположим, у меня есть эти две таблицы.Для первой таблицы у меня есть пользователи, которым назначен тест A / B и версия A или B. Для второй таблицы у меня есть события, сохраненные для каждого пользователя, который взаимодействует со страницей.(Каждый пользователь с событием «нажал» изначально имеет событие «загружен»).

Таблица: dbo.tests

|user | test_name| version |
+-----+----------+---------+
| 1   | "foo"    | "A"     |
| 1   | "bar"    | "B"     |
| 2   | "foo"    | "A"     |
| 3   | "bar"    | "B"     |

Таблица: dbo.events

|user | event           | event_date |
+-----+-----------------+------------+
| 1   | "loaded"        | 2019-01-01 |
| 1   | "clicked"       | 2019-01-02 |
| 2   | "loaded"        | 2019-05-29 |
| 3   | "loaded"        | 2019-06-01 |

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

1 Ответ

0 голосов
/ 28 сентября 2019

Если я правильно понимаю, это join с условной агрегацией:

select u.test_name,
       (sum(case when e.event = 'clicked' then 1.0 else 0 end) /
        sum(case when e.event = 'loaded' then 1 end)
       )
from users u left join
     events e
     on u.user = e.user
group by u.test_name;

Примечание. Это не проверяет событие «загружено» в паре с «нажатием», потому что выскажем, это всегда там.

Если у пользователей могут быть повторяющиеся события, тогда используйте count(distinct):

select u.test_name,
       (count(distinct case when e.event = 'clicked' then u.user end) * 1.0 /
        count(distinct case when e.event = 'loaded' then 1 end u.user end)
       )
from users u left join
     events e
     on u.user = e.user
group by u.test_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...