SQL Group By + Count с несколькими таблицами - PullRequest
0 голосов
/ 02 сентября 2018

Я готовлюсь к собеседованию на следующей неделе, в котором есть небольшой компонент анализа данных. Рекрутер дал мне следующий пример SQL-вопроса, из-за которого у меня возникли проблемы с решением проблемы. Я надеюсь, что я не откусываю больше, чем могу жевать;) ..

ОБРАЗЕЦ ВОПРОСА:

Вам даны две таблицы:

Таблица AdClick (столбцы: ClickID, AdvertiserID, UserID и другие поля) и AdConversion Table (столбцы: ClickID, UserID и другие поля).

Вы должны найти общий коэффициент конверсии (количество конверсий / количество клики) для пользователей одним кликом, двумя кликами и т. д.

Я играл с этим около часа и продолжаю преодолевать дорожные блоки. Я понимаю COUNT и GROUP BY, но подозреваю, что мне не хватает простой функции SQL, о которой я не знаю. Это также затрудняет мне поиск любых возможных указателей / решений через Google: незнание магических ключевых слов для поиска.

Пример ввода

dbo.AdConversion
----------------
ClickID UserID
1   1
2   1
4   1
5   3
6   2
7   2
12  1
9   4
10  4

dbo.AdClick
-----------
ClickID AdvertiserID    UserID
1   1   1
2   2   1
3   1   2
4   1   1
5   1   3
6   2   2
7   3   2
8   1   1
9   4   4
10  2   4
11  3   4
12  2   1

Expected Result:
----------------
UserClickCount  ConversionRate
4       80.00%
2       66.67%
1       100.00%     

Объяснение / уточнение:

Пользователи с 4 AdConversion.ClickIDs (также известные как «Конверсии») имеют 80% беседы. Здесь есть только один пользователь, UserID 1, который имеет 5 AdClicks с 4 AdConversion.

Пользователи с 2 конверсиями имеют 6 конверсий с 4 конверсиями для коэффициента конверсии 66,67%. Здесь это будут UserID 2 и 4.

Пользователи с 1 конверсией, здесь только UserID 3, имеют 1 конверсию против 1 AdClick для 100% конверсии.


Вот одно из возможных решений, которое я нашел после некоторого указания из комментария Зака. Я не могу себе представить, что это идеальное решение или в нем есть ошибки или нет:

DECLARE @Conversions TABLE
(
UserID int NOT NULL,
AdConversions int
)

INSERT INTO @Conversions (UserID, AdConversions)
SELECT adc.UserID, COUNT(adc.UserID)
FROM dbo.AdConversion adc
GROUP BY adc.UserID;

DECLARE @Clicks TABLE
(
UserID int NOT NULL,
AdClicks int
)
INSERT INTO @Clicks(UserID, AdClicks)
SELECT UserID, Count (ClickID)
FROM dbo.AdClick
GROUP BY UserID;


SELECT co.AdConversions, CONVERT(decimal(6,3), (CAST(SUM(co.AdConversions) AS float) / SUM(cl.AdClicks))) * 100
FROM @Conversions co
INNER JOIN @Clicks cl
ON co.UserID = cl.UserID
GROUP BY co.AdConversions;

Любой совет будет с благодарностью!

Спасибо, Michael

1 Ответ

0 голосов
/ 02 сентября 2018

Ваша логика кажется хорошей. Вот версия с общими табличными выражениями и небольшим обновлением с числовым преобразованием:

WITH tConversions as 

(SELECT UserID, COUNT(ClickID) as AdConversions
FROM AdConversion
GROUP BY UserID),

tClicks as

(SELECT UserID, COUNT(ClickID) as AdClicks
FROM AdClick
GROUP BY UserID)

SELECT co.AdConversions, CONVERT(decimal(10,2),CAST(SUM(co.AdConversions) as float) / SUM(cl.AdClicks) * 100) as ConversionRate
FROM tConversions co
INNER JOIN tClicks cl
ON co.UserID = cl.UserID
GROUP BY co.AdConversions

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

SELECT co.AdConversions, CONVERT(decimal(10,2),CAST(SUM(co.AdConversions) as float) / SUM(cl.AdClicks) * 100) as ConversionRate
FROM 

(SELECT UserID, COUNT(ClickID) as AdConversions
FROM AdConversion
GROUP BY UserID)

as co

INNER JOIN

(SELECT UserID, COUNT(ClickID) as AdClicks
FROM AdClick
GROUP BY UserID)

as cl

ON co.UserID = cl.UserID
GROUP BY co.AdConversions
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...