-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1322-AdsPerformance.sql
More file actions
105 lines (99 loc) · 3.46 KB
/
1322-AdsPerformance.sql
File metadata and controls
105 lines (99 loc) · 3.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
-- 1322. Ads Performance
-- Table: Ads
-- +---------------+---------+
-- | Column Name | Type |
-- +---------------+---------+
-- | ad_id | int |
-- | user_id | int |
-- | action | enum |
-- +---------------+---------+
-- (ad_id, user_id) is the primary key (combination of columns with unique values) for this table.
-- Each row of this table contains the ID of an Ad, the ID of a user, and the action taken by this user regarding this Ad.
-- The action column is an ENUM (category) type of ('Clicked', 'Viewed', 'Ignored').
-- A company is running Ads and wants to calculate the performance of each Ad.
-- Performance of the Ad is measured using Click-Through Rate (CTR) where:
-- Write a solution to find the ctr of each Ad. Round ctr to two decimal points.
-- Return the result table ordered by ctr in descending order and by ad_id in ascending order in case of a tie.
-- The result format is in the following example.
-- Example 1:
-- Input:
-- Ads table:
-- +-------+---------+---------+
-- | ad_id | user_id | action |
-- +-------+---------+---------+
-- | 1 | 1 | Clicked |
-- | 2 | 2 | Clicked |
-- | 3 | 3 | Viewed |
-- | 5 | 5 | Ignored |
-- | 1 | 7 | Ignored |
-- | 2 | 7 | Viewed |
-- | 3 | 5 | Clicked |
-- | 1 | 4 | Viewed |
-- | 2 | 11 | Viewed |
-- | 1 | 2 | Clicked |
-- +-------+---------+---------+
-- Output:
-- +-------+-------+
-- | ad_id | ctr |
-- +-------+-------+
-- | 1 | 66.67 |
-- | 3 | 50.00 |
-- | 2 | 33.33 |
-- | 5 | 0.00 |
-- +-------+-------+
-- Explanation:
-- for ad_id = 1, ctr = (2/(2+1)) * 100 = 66.67
-- for ad_id = 2, ctr = (1/(1+2)) * 100 = 33.33
-- for ad_id = 3, ctr = (1/(1+1)) * 100 = 50.00
-- for ad_id = 5, ctr = 0.00, Note that ad_id = 5 has no clicks or views.
-- Note that we do not care about Ignored Ads.
-- Create table If Not Exists Ads (ad_id int, user_id int, action ENUM('Clicked', 'Viewed', 'Ignored'))
-- Truncate table Ads
-- insert into Ads (ad_id, user_id, action) values ('1', '1', 'Clicked')
-- insert into Ads (ad_id, user_id, action) values ('2', '2', 'Clicked')
-- insert into Ads (ad_id, user_id, action) values ('3', '3', 'Viewed')
-- insert into Ads (ad_id, user_id, action) values ('5', '5', 'Ignored')
-- insert into Ads (ad_id, user_id, action) values ('1', '7', 'Ignored')
-- insert into Ads (ad_id, user_id, action) values ('2', '7', 'Viewed')
-- insert into Ads (ad_id, user_id, action) values ('3', '5', 'Clicked')
-- insert into Ads (ad_id, user_id, action) values ('1', '4', 'Viewed')
-- insert into Ads (ad_id, user_id, action) values ('2', '11', 'Viewed')
-- insert into Ads (ad_id, user_id, action) values ('1', '2', 'Clicked')
SELECT
ad_id,
ROUND(
IFNULL(
SUM(
CASE WHEN action='Clicked' THEN 1 ELSE 0 END
) /
SUM(
CASE WHEN action != 'Ignored' THEN 1 ELSE 0 END -- 不关心 action 为 Ingnored 的广告
) * 100
, 0
)
,2
) AS ctr
FROM
Ads
GROUP BY
ad_id
ORDER BY
ctr DESC, ad_id ASC -- 结果需要按 ctr 降序、按 ad_id 升序 进行排序
SELECT
ad_id,
IFNULL(
ROUND(
SUM(IF (action = 'Clicked', 1, 0))
/
(SUM(IF (action != 'Ignored', 1, 0)) )
* 100
, 2
)
, 0
) AS ctr
FROM
Ads
GROUP BY
ad_id
ORDER BY
ctr DESC, ad_id ASC