我正在研究下周的采访,其中包含一个小的数据分析组件。招聘人员给了我以下示例SQL问题,使我难以解决某个解决方案。我希望我不会被咬得更多;)..
示例问题:
您将获得两个表:
AdClick表(列:ClickID,AdvertiserID,UserID和其他 字段)和AdConversion表(列:ClickID,UserID和其他 字段)。
您必须找到总转化率(转化次数/ 点击),供1次点击,2次点击等的用户使用。
我已经玩了大约一个小时,并且一直遇到障碍。我了解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.ClickID(又称转化)的用户的会话率达到80%。 这里只有一个用户,用户ID 1,其中有5个AdClicks和4个AdConversions。
进行2次转化的用户总共获得6次Adclicks和4次转化,转化率为66.67%。在这里,它是用户ID 2和4。
具有1次转化的用户(这里只有UserID 3)针对1个AdClick进行了1次转化,转化率为100%。
从Zack的评论中得到一些指导之后,这是我想出的一种可能的解决方案。我无法想象这是理想的解决方案,或者它是否包含错误:
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;
任何建议将不胜感激!
谢谢, 迈克尔
答案 0 :(得分:2)
您的逻辑似乎很好。这是具有常用表表达式的版本,并带有数字转换的一点更新:
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