+----------------+---------+
| Column Name | Type |
+----------------+---------+
| id | int |
| name | varchar |
| phone_number | varchar |
+----------------+---------+
id is the column of unique values for this table.
Each row of this table contains the name of a person and their phone number.
Phone number will be in the form 'xxx-yyyyyyy' where xxx is the country code (3 characters) and yyyyyyy is the phone number (7 characters) where x and y are digits. Both can contain leading zeros.
Table Country:
+----------------+---------+
| Column Name | Type |
+----------------+---------+
| name | varchar |
| country_code | varchar |
+----------------+---------+
country_code is the column of unique values for this table.
Each row of this table contains the country name and its code. country_code will be in the form 'xxx' where x is digits.
Table Calls:
+-------------+------+
| Column Name | Type |
+-------------+------+
| caller_id | int |
| callee_id | int |
| duration | int |
+-------------+------+
This table may contain duplicate rows.
Each row of this table contains the caller id, callee id and the duration of the call in minutes. caller_id != callee_id
A telecommunications company wants to invest in new countries. The company intends to invest in the countries where the average call duration of the calls in this country is strictly greater than the global average call duration.
Write a solution to find the countries where this company can invest.
Input:
Person table:+----+----------+--------------+| id | name | phone_number |+----+----------+--------------+|3| Jonathan |051-1234567||12| Elvis |051-7654321||1| Moncef |212-1234567||2| Maroua |212-6523651||7| Meir |972-1234567||9| Rachel |972-0011100|+----+----------+--------------+Country table:+----------+--------------+| name | country_code |+----------+--------------+| Peru |051|| Israel |972|| Morocco |212|| Germany |049|| Ethiopia |251|+----------+--------------+Calls table:+-----------+-----------+----------+| caller_id | callee_id | duration |+-----------+-----------+----------+|1|9|33||2|9|4||1|2|59||3|12|102||3|12|330||12|3|5||7|9|13||7|1|3||9|7|1||1|7|7|+-----------+-----------+----------+Output:
+----------+| country |+----------+| Peru |+----------+Explanation:
The average call duration for Peru is(102+102+330+330+5+5)/6=145.666667The average call duration for Israel is(33+4+13+13+3+1+1+7)/8=9.37500The average call duration for Morocco is(33+4+59+59+3+7)/6=27.5000Global call duration average =(2*(33+4+59+102+330+5+13+3+1+7))/20=55.70000Since Peru is the only country where the average call duration is greater than the global average, it is the only recommended country.
The key idea is to compute the average call duration for each country and compare it to the global average. We join the Person, Country, and Calls tables to associate each call with a country, then aggregate durations by country and globally.
SELECTc.name AS country
FROM (
SELECT co.name, AVG(ca.duration) AS avg_duration
FROM Person p
JOIN Country co ONLEFT(p.phone_number, 3) = co.country_code
JOIN Calls ca ON ca.caller_id = p.id
GROUPBY co.name
) cJOIN (
SELECTAVG(duration) AS global_avg
FROM Calls
) gON1=1WHEREc.avg_duration >g.global_avg;
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECTc.name AS country
FROM (
SELECT co.name, AVG(ca.duration) AS avg_duration
FROM Person p
JOIN Country co ONLEFT(p.phone_number, 3) = co.country_code
JOIN Calls ca ON ca.caller_id = p.id
GROUPBY co.name
) cJOIN (
SELECTAVG(duration) AS global_avg
FROM Calls
) gONTRUEWHEREc.avg_duration >g.global_avg;