Grokking SQL for Tech Interviews
Ask Author
Back to course home

0% completed

Vote For New Content
11. Weather Type in Each Country
Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Problem

Table: Countries

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| country_id    | int     |
| country_name  | varchar |
+---------------+---------+
country_id is the primary key (column with unique values) for this table.
Each row of this table contains the ID and the name of one country.

Table: Weather

+---------------+------+
| Column Name   | Type |
+---------------+------+
| country_id    | int  |
| weather_state | int  |
| day           | date |
+---------------+------+
(country_id, day) is the primary key (combination of columns with unique values) for this table.
Each row of this table indicates the weather state in a country for one day.

Problem Definition

Write a solution to find the type of weather in each country for November 2019.

The type of weather is:

  • Cold if the average weather_state is less than or equal 15,
  • Hot if the average weather_state is greater than or equal to 25, and
  • Warm otherwise.

Return the result table.

Example

Image

Output

Image

Try It Yourself

MYSQL
MYSQL

. . . .

Solution

To solve this problem, we need to determine the type of weather in each country for November 2019, based on the average weather_state values. The solution involves utilizing SQL queries to retrieve and process the necessary information from the given Countries and Weather tables.

Firstly, we employ the JOIN clause to combine data from both tables, linking them through the country_id column. This allows us to access the country names and their corresponding weather states. The JOIN operation is crucial for merging the relevant information from both tables into a single dataset.

Next, we utilize the AND operator in the ON clause to specify additional conditions for the join. Specifically, we filter the data to include only records from November 2019 by checking the year and month of the day column in the Weather table.

After joining and filtering the data, the GROUP BY clause is applied to group the results by country_name. This is essential for calculating the average weather_state for each country.

The AVG function is then used to compute the average weather state within each group, and the results are categorized into different weather types using the CASE statement. If the average weather_state is less than or equal to 15, the weather type is classified as 'Cold'; if it is greater than or equal to 25, the type is 'Hot'; otherwise, it is classified as 'Warm'.

SELECT country_name, CASE WHEN AVG(weather_state) <= 15 THEN 'Cold' WHEN AVG(weather_state) >= 25 THEN 'Hot' ELSE 'Warm' END AS weather_type FROM Countries JOIN Weather ON Countries.country_id = Weather.country_id AND YEAR(day) = '2019' AND MONTH(day) = '11' GROUP BY country_name

Let's break down the query step by step:

Step 1: Filter Data for November 2019

We start by filtering the data from the Weather table for November 2019.

SELECT * FROM Weather WHERE YEAR(day) = '2019' AND MONTH(day) = '11';

Output After Step 1:

+------------+---------------+------------+ | country_id | weather_state | day | +------------+---------------+------------+ | 2 | 15 | 2019-11-01 | | 3 | -2 | 2019-11-10 | | 3 | 0 | 2019-11-11 | | 3 | 3 | 2019-11-12 | | 5 | 16 | 2019-11-07 | | 5 | 18 | 2019-11-09 | | 5 | 21 | 2019-11-23 | | 7 | 25 | 2019-11-28 | | 8 | 25 | 2019-11-05 | | 8 | 27 | 2019-11-15 | | 8 | 31 | 2019-11-25 | +------------+---------------+------------+

Step 2: Calculate Average Weather State

Next, we calculate the average weather_state for each country.

SELECT country_id, AVG(weather_state) AS avg_weather_state FROM Step1 GROUP BY country_id;

Output After Step 2:

+------------+-------------------+ | country_id | avg_weather_state | +------------+-------------------+ | 2 | 15 | | 3 | 0.333 | | 5 | 18.333 | | 7 | 25 | | 8 | 27.667 | +------------+-------------------+

Step 3: Determine Weather Type

Now, we use a CASE statement to determine the weather type for each country based on the average weather_state.

SELECT country_id, CASE WHEN avg_weather_state <= 15 THEN 'Cold' WHEN avg_weather_state >= 25 THEN 'Hot' ELSE 'Warm' END AS weather_type FROM Step2;

Output After Step 3:

+------------+--------------+ | country_id | weather_type | +------------+--------------+ | 2 | Cold | | 3 | Cold | | 5 | Warm | | 7 | Hot | | 8 | Hot | +------------+--------------+

Step 4: Join with Countries Table

Finally, we join the result with the Countries table to get the country names.

SELECT c.country_name, w.weather_type FROM Step3 w JOIN Countries c ON w.country_id = c.country_id;

Final Output:

+--------------+--------------+ | country_name | weather_type | +--------------+--------------+ | USA | Cold | | Australia | Cold | | China | Warm | | Peru | Hot | | Morocco | Hot | +--------------+--------------+

.....

.....

.....

Like the course? Get enrolled and start learning!

Table of Contents

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible

Contents are not accessible