-- Question 3-- Table: Activity
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| player_id |int|--| device_id |int|--| event_date | date |--| games_played |int|--+--------------+---------+-(player_id,event_date)是此表的主键。
-此表显示了某些游戏的玩家活动。
-每行记录了一个玩家在某天使用某种设备注销之前登录并玩了许多游戏(可能为0)的记录。
-编写一个SQL查询,报告每个玩家的首次登录日期。
-- The query result format is in the following example:-- Activity table:--+-----------+-----------+------------+--------------+--| player_id | device_id | event_date | games_played |--+-----------+-----------+------------+--------------+--|1|2|2016-03-01|5|--|1|2|2016-05-02|6|--|2|3|2017-06-25|1|--|3|1|2016-03-02|0|--|3|4|2018-07-03|5|--+-----------+-----------+------------+--------------+-- Result table:--+-----------+-------------+--| player_id | first_login |--+-----------+-------------+--|1|2016-03-01|--|2|2017-06-25|--|3|2016-03-02|--+-----------+-------------+
-- Solution
Select player_id,min(event_date) as first_login
from Activity
Group by player_id
22 Game play analysis 2.sql
-- Table: Activity
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| player_id |int|--| device_id |int|--| event_date | date |--| games_played |int|--+--------------+---------+--(player_id, event_date) is the primary key of this table.-- This table shows the activity of players of some game.-- Each row is a record of a player who logged in and played a number of games (possibly 0) before logging out on some day using some device.-- Write a SQL query that reports the device that is first logged in for each player.-- The query result format is in the following example:-- Activity table:--+-----------+-----------+------------+--------------+--| player_id | device_id | event_date | games_played |--+-----------+-----------+------------+--------------+--|1|2|2016-03-01|5|--|1|2|2016-05-02|6|--|2|3|2017-06-25|1|--|3|1|2016-03-02|0|--|3|4|2018-07-03|5|--+-----------+-----------+------------+--------------+-- Result table:--+-----------+-----------+--| player_id | device_id |--+-----------+-----------+--|1|2|--|2|3|--|3|1|--+-----------+-----------+
With table1 as
(
Select player_id, device_id,Rank()OVER(partition by player_id
order by event_date) as rk
From Activity
)
Select t.player_id, t.device_id
from table1 as t
where t.rk=1
23 Group sold products by the date.sql
-- Table Activities:--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| sell_date | date |--| product | varchar |--+-------------+---------+-- There is no primary key forthis table, it may contains duplicates.-- Each row of this table contains the product name and the date it was sold in a market.-编写SQL查询以查找每个日期,所售不同产品的数量及其名称。
-每个日期的已售产品名称应按字典顺序排序。
-返回按Sell_date排序的结果表。
-- The query result format is in the following example.-- Activities table:--+------------+-------------+--| sell_date | product |--+------------+-------------+--|2020-05-30| Headphone |--|2020-06-01| Pencil |--|2020-06-02| Mask |--|2020-05-30| Basketball |--|2020-06-01| Bible |--|2020-06-02| Mask |--|2020-05-30| T-Shirt |--+------------+-------------+-- Result table:--+------------+----------+------------------------------+--| sell_date | num_sold | products |--+------------+----------+------------------------------+--|2020-05-30|3| Basketball,Headphone,T-shirt |--|2020-06-01|2| Bible,Pencil |--|2020-06-02|1| Mask |--+------------+----------+------------------------------+-- For 2020-05-30, Sold items were (Headphone, Basketball, T-shirt), we sort them lexicographically and separate them by comma.-- For 2020-06-01, Sold items were (Pencil, Bible), we sort them lexicographically and separate them by comma.-- For 2020-06-02, Sold item is (Mask), we just return it.
select sell_date,count(distinct product) as num_sold,group_concat(distinct product) as products
from activities
group by sell_date
order by sell_date
-- Table: Delivery
--+-----------------------------+---------+--| Column Name | Type |--+-----------------------------+---------+--| delivery_id |int|--| customer_id |int|--| order_date | date |--| customer_pref_delivery_date | date |--+-----------------------------+---------+-- delivery_id is the primary key of this table.-- The table holds information about food delivery to customers that make orders at some date and specify a preferred delivery date (on the same order date or after it).-- If the preferred delivery date of the customer is the same as the order date then the order is called immediate otherwise it's called scheduled.-- Write an SQL query to find the percentage of immediate orders in the table, rounded to 2 decimal places.-- The query result format is in the following example:-- Delivery table:--+-------------+-------------+------------+-----------------------------+--| delivery_id | customer_id | order_date | customer_pref_delivery_date |--+-------------+-------------+------------+-----------------------------+--|1|1|2019-08-01|2019-08-02|--|2|5|2019-08-02|2019-08-02|--|3|1|2019-08-11|2019-08-11|--|4|3|2019-08-24|2019-08-26|--|5|4|2019-08-21|2019-08-22|--|6|2|2019-08-11|2019-08-13|--+-------------+-------------+------------+-----------------------------+-- Result table:--+----------------------+--| immediate_percentage |--+----------------------+--|33.33|--+----------------------+-- The orders with delivery id 2 and 3 are immediate while the others are scheduled.
-- Solution
Select
Round(avg(case when order_date=customer_pref_delivery_date then 1else0 end)*100,2) as immediate_percentage
from delivery
25 List the products ordered in a period.sql
-- Table: Products
--+------------------+---------+--| Column Name | Type |--+------------------+---------+--| product_id |int|--| product_name | varchar |--| product_category | varchar |--+------------------+---------+-- product_id is the primary key forthis table.-- This table contains data about the company's products.-- Table: Orders
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| product_id |int|--| order_date | date |--| unit |int|--+---------------+---------+-- There is no primary key forthis table. It may have duplicate rows.-- product_id is a foreign key to Products table.-- unit is the number of products ordered in order_date.-- Write an SQL query to get the names of products with greater than or equal to 100 units ordered in February 2020 and their amount.-- Return result table in any order.-- The query result format is in the following example:-- Products table:--+-------------+-----------------------+------------------+--| product_id | product_name | product_category |--+-------------+-----------------------+------------------+--|1| Leetcode Solutions | Book |--|2| Jewels of Stringology | Book |--|3| HP | Laptop |--|4| Lenovo | Laptop |--|5| Leetcode Kit | T-shirt |--+-------------+-----------------------+------------------+-- Orders table:--+--------------+--------------+----------+--| product_id | order_date | unit |--+--------------+--------------+----------+--|1|2020-02-05|60|--|1|2020-02-10|70|--|2|2020-01-18|30|--|2|2020-02-11|80|--|3|2020-02-17|2|--|3|2020-02-24|3|--|4|2020-03-01|20|--|4|2020-03-04|30|--|4|2020-03-04|60|--|5|2020-02-25|50|--|5|2020-02-27|50|--|5|2020-03-01|50|--+--------------+--------------+----------+-- Result table:--+--------------------+---------+--| product_name | unit |--+--------------------+---------+--| Leetcode Solutions |130|--| Leetcode Kit |100|--+--------------------+---------+-- Products with product_id =1 is ordered in February a total of (60+70)=130.-- Products with product_id =2 is ordered in February a total of 80.-- Products with product_id =3 is ordered in February a total of (2+3)=5.-- Products with product_id =4 was not ordered in February 2020.-- Products with product_id =5 is ordered in February a total of (50+50)=100.
Select a.product_name, a.unit
from
(select p.product_name,sum(unit) as unit
from orders o
join products p
on o.product_id = p.product_id
where month(order_date)=2 and year(order_date)=2020
group by o.product_id) a
where a.unit>=100
-- X city opened a newcinema, many people would like to go to this cinema.-- The cinema also gives out a poster indicating the movies’ ratings and descriptions.-- Please write a SQL query to output movies with an odd numbered ID and a description that is not 'boring'.-- Order the result by rating.-- For example, table cinema:--+---------+-----------+--------------+-----------+--| id | movie | description | rating |--+---------+-----------+--------------+-----------+--|1| War | great 3D|8.9|--|2| Science | fiction |8.5|--|3| irish | boring |6.2|--|4| Ice song | Fantacy |8.6|--|5| House card| Interesting|9.1|--+---------+-----------+--------------+-----------+-- For the example above, the output should be:--+---------+-----------+--------------+-----------+--| id | movie | description | rating |--+---------+-----------+--------------+-----------+--|5| House card| Interesting|9.1|--|1| War | great 3D|8.9|--+---------+-----------+--------------+-----------+
Select *
from cinema
where id%2=1 and description !=('boring')
order by rating desc
27 Number of comments per post.sql
-- Table: Submissions
--+---------------+----------+--| Column Name | Type |--+---------------+----------+--| sub_id |int|--| parent_id |int|--+---------------+----------+-该表没有主键,它可能有重复的行。
-每行可以是一个帖子或对该帖子的评论。
-对于帖子,parent_id为null。
-注释的parent_id是表中另一条帖子的sub_id。
-- Write an SQL query to find number of comments per each post.-- Result table should contain post_id and its corresponding number_of_comments,-- and must be sorted by post_id in ascending order.-- Submissions may contain duplicate comments. You should count the number of unique comments per post.-- Submissions may contain duplicate posts. You should treat them as one post.-- The query result format is in the following example:-- Submissions table:--+---------+------------+--| sub_id | parent_id |--+---------+------------+--|1| Null |--|2| Null |--|1| Null |--|12| Null |--|3|1|--|5|2|--|3|1|--|4|1|--|9|1|--|10|2|--|6|7|--+---------+------------+-- Result table:--+---------+--------------------+--| post_id | number_of_comments |--+---------+--------------------+--|1|3|--|2|2|--|12|0|--+---------+--------------------+-- The post with id 1 has three comments in the table with id 3,4 and 9. The comment with id 3 is
-- repeated in the table, we counted it only once.-- The post with id 2 has two comments in the table with id 5 and 10.-- The post with id 12 has no comments in the table.-- The comment with id 6 is a comment on a deleted post with id 7 so we ignored it.
-- Solution
Select a.sub_id as post_id,coalesce(b.number_of_comments,0) as number_of_comments
from(
select distinct sub_id from submissions where parent_id is null) a
left join(
select parent_id,count(distinct(sub_id)) as number_of_comments
from submissions
group by parent_id
having parent_id =any(select sub_id from submissions where parent_id is null)) b
on a.sub_id = b.parent_id
order by post_id
coalesce()但其实作用是将返回传入的参数中第一个非null的值
28 Product Sales Analysis 1.sql
-- Table: Sales
--+-------------+-------+--| Column Name | Type |--+-------------+-------+--| sale_id |int|--| product_id |int|--| year |int|--| quantity |int|--| price |int|--+-------------+-------+--(sale_id, year) is the primary key of this table.-- product_id is a foreign key to Product table.-- Note that the price is per unit.-- Table: Product
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| product_id |int|--| product_name | varchar |--+--------------+---------+-- product_id is the primary key of this table.-- Write an SQL query that reports all product names of the products in the Sales table along with their selling year and price.-- For example:-- Sales table:--+---------+------------+------+----------+-------+--| sale_id | product_id | year | quantity | price |--+---------+------------+------+----------+-------+--|1|100|2008|10|5000|--|2|100|2009|12|5000|--|7|200|2011|15|9000|--+---------+------------+------+----------+-------+-- Product table:--+------------+--------------+--| product_id | product_name |--+------------+--------------+--|100| Nokia |--|200| Apple |--|300| Samsung |--+------------+--------------+-- Result table:--+--------------+-------+-------+--| product_name | year | price |--+--------------+-------+-------+--| Nokia |2008|5000|--| Nokia |2009|5000|--| Apple |2011|9000|--+--------------+-------+-------+
-- Solution
Select a.product_name, b.year, b.price
from product as a
join
sales as b
on a.product_id = b.product_id
29 Product Sales Analysis 2.sql
-- Table: Sales
--+-------------+-------+--| Column Name | Type |--+-------------+-------+--| sale_id |int|--| product_id |int|--| year |int|--| quantity |int|--| price |int|--+-------------+-------+-- sale_id is the primary key of this table.-- product_id is a foreign key to Product table.-- Note that the price is per unit.-- Table: Product
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| product_id |int|--| product_name | varchar |--+--------------+---------+-- product_id is the primary key of this table.-- Write an SQL query that reports the total quantity sold for every product id.-- The query result format is in the following example:-- Sales table:--+---------+------------+------+----------+-------+--| sale_id | product_id | year | quantity | price |--+---------+------------+------+----------+-------+--|1|100|2008|10|5000|--|2|100|2009|12|5000|--|7|200|2011|15|9000|--+---------+------------+------+----------+-------+-- Product table:--+------------+--------------+--| product_id | product_name |--+------------+--------------+--|100| Nokia |--|200| Apple |--|300| Samsung |--+------------+--------------+-- Result table:--+--------------+----------------+--| product_id | total_quantity |--+--------------+----------------+--|100|22|--|200|15|--+--------------+----------------+
-- Solution
Select a.product_id,sum(a.quantity) as total_quantity
from sales a
group by a.product_id
30 Project Employees 1.sql
-- Table: Project
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| project_id |int|--| employee_id |int|--+-------------+---------+--(project_id, employee_id) is the primary key of this table.-- employee_id is a foreign key to Employee table.-- Table: Employee
--+------------------+---------+--| Column Name | Type |--+------------------+---------+--| employee_id |int|--| name | varchar |--| experience_years |int|--+------------------+---------+-- employee_id is the primary key of this table.-- Write an SQL query that reports the average experience years of all the employees for each project, rounded to 2 digits.-- The query result format is in the following example:-- Project table:--+-------------+-------------+--| project_id | employee_id |--+-------------+-------------+--|1|1|--|1|2|--|1|3|--|2|1|--|2|4|--+-------------+-------------+-- Employee table:--+-------------+--------+------------------+--| employee_id | name | experience_years |--+-------------+--------+------------------+--|1| Khaled |3|--|2| Ali |2|--|3| John |1|--|4| Doe |2|--+-------------+--------+------------------+-- Result table:--+-------------+---------------+--| project_id | average_years |--+-------------+---------------+--|1|2.00|--|2|2.50|--+-------------+---------------+-- The average experience years for the first project is (3+2+1)/3=2.00 and for the second project is (3+2)/2=2.50
-- Solution
Select a.project_id,round(avg(b.experience_years),2) as average_years
from project as a
join
employee as b
on a.employee_id=b.employee_id
group by a.project_id
31 Project Employees 2.sql
-- Table: Project
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| project_id |int|--| employee_id |int|--+-------------+---------+--(project_id, employee_id) is the primary key of this table.-- employee_id is a foreign key to Employee table.-- Table: Employee
--+------------------+---------+--| Column Name | Type |--+------------------+---------+--| employee_id |int|--| name | varchar |--| experience_years |int|--+------------------+---------+-- employee_id is the primary key of this table.-- 编写一个SQL查询,报告所有雇员最多的项目。
-- The query result format is in the following example:-- Project table:--+-------------+-------------+--| project_id | employee_id |--+-------------+-------------+--|1|1|--|1|2|--|1|3|--|2|1|--|2|4|--+-------------+-------------+-- Employee table:--+-------------+--------+------------------+--| employee_id | name | experience_years |--+-------------+--------+------------------+--|1| Khaled |3|--|2| Ali |2|--|3| John |1|--|4| Doe |2|--+-------------+--------+------------------+-- Result table:--+-------------+--| project_id |--+-------------+--|1|--+-------------+-- The first project has 3 employees while the second one has 2.
-- Solution
select a.project_id
from(
select project_id,rank()over(order by count(employee_id) desc) as rk
from project
group by project_id) a
where a.rk =1
32 Queries quality and percentage.sql
-- Table: Queries
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| query_name | varchar |--| result | varchar |--| position |int|--| rating |int|--+-------------+---------+-- There is no primary key forthis table, it may have duplicate rows.-- This table contains information collected from some queries on a database.-- The position column has a value from 1 to 500.-- The rating column has a value from 1 to 5. Query with rating less than 3 is a poor query.-- We define query quality as:-rating 与position 之间的比率的平均值。
-- We also define poor query percentage as:---rating 低于3的所有查询占的百分比
-- Write an SQL query to find each query_name, the quality and poor_query_percentage.-- Both quality and poor_query_percentage should be rounded to 2 decimal places.-- The query result format is in the following example:-- Queries table:--+------------+-------------------+----------+--------+--| query_name | result | position | rating |--+------------+-------------------+----------+--------+--| Dog | Golden Retriever |1|5|--| Dog | German Shepherd |2|5|--| Dog | Mule |200|1|--| Cat | Shirazi |5|2|--| Cat | Siamese |3|3|--| Cat | Sphynx |7|4|--+------------+-------------------+----------+--------+-- Result table:--+------------+---------+-----------------------+--| query_name | quality | poor_query_percentage |--+------------+---------+-----------------------+--| Dog |2.50|33.33|--| Cat |0.66|33.33|--+------------+---------+-----------------------+-- Dog queries quality is ((5/1)+(5/2)+(1/200))/3=2.50-- Dog queries poor_ query_percentage is (1/3)*100=33.33-- Cat queries quality equals ((2/5)+(3/3)+(4/7))/3=0.66-- Cat queries poor_ query_percentage is (1/3)*100=33.33
-- Solution
Select query_name,round(avg(rating/position),2) as quality,round(avg(case when rating<3 then 1else0 end)*100,2) as poor_query_percentage
from queries
group by query_name
33 Reformat department table.sql
-- Table: Department
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| revenue |int|--| month | varchar |--+---------------+---------+--(id, month) is the primary key of this table.-- The table has information about the revenue of each department per month.-- The month has values in ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"].-- 编写SQL查询以重新格式化表格,以使每个月都有一个部门ID列和一个收入列。
-- The query result format is in the following example:-- Department table:--+------+---------+-------+--| id | revenue | month |--+------+---------+-------+--|1|8000| Jan |--|2|9000| Jan |--|3|10000| Feb |--|1|7000| Feb |--|1|6000| Mar |--+------+---------+-------+-- Result table:--+------+-------------+-------------+-------------+-----+-------------+--| id | Jan_Revenue | Feb_Revenue | Mar_Revenue |...| Dec_Revenue |--+------+-------------+-------------+-------------+-----+-------------+--|1|8000|7000|6000|...| null |--|2|9000| null | null |...| null |--|3| null |10000| null |...| null |--+------+-------------+-------------+-------------+-----+-------------+-- Note that the result table has 13 columns (1for the department id +12for the months).
-- Solution
select id,sum(if(month='Jan',revenue,null)) as Jan_Revenue,sum(if(month='Feb',revenue,null)) as Feb_Revenue,sum(if(month='Mar',revenue,null)) as Mar_Revenue,sum(if(month='Apr',revenue,null)) as Apr_Revenue,sum(if(month='May',revenue,null)) as May_Revenue,sum(if(month='Jun',revenue,null)) as Jun_Revenue,sum(if(month='Jul',revenue,null)) as Jul_Revenue,sum(if(month='Aug',revenue,null)) as Aug_Revenue,sum(if(month='Sep',revenue,null)) as Sep_Revenue,sum(if(month='Oct',revenue,null)) as Oct_Revenue,sum(if(month='Nov',revenue,null)) as Nov_Revenue,sum(if(month='Dec',revenue,null)) as Dec_Revenue
from Department
group by id
这里巧妙借助了groupby 和sum
34 Replace employee id with unique identifier.sql
-- Table: Employees
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| name | varchar |--+---------------+---------+-- id is the primary key forthis table.-- Each row of this table contains the id and the name of an employee in a company.-- Table: EmployeeUNI
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| unique_id |int|--+---------------+---------+--(id, unique_id) is the primary key forthis table.-- Each row of this table contains the id and the corresponding unique id of an employee in the company.-- Write an SQL query to show the unique ID of each user, If a user doesn't have a unique ID replace just show null.-- Return the result table in any order.-- The query result format is in the following example:-- Employees table:--+----+----------+--| id | name |--+----+----------+--|1| Alice |--|7| Bob |--|11| Meir |--|90| Winston |--|3| Jonathan |--+----+----------+-- EmployeeUNI table:--+----+-----------+--| id | unique_id |--+----+-----------+--|3|1|--|11|2|--|90|3|--+----+-----------+-- EmployeeUNI table:--+-----------+----------+--| unique_id | name |--+-----------+----------+--| null | Alice |--| null | Bob |--|2| Meir |--|3| Winston |--|1| Jonathan |--+-----------+----------+-- Alice and Bob don't have a unique ID, We will show null instead.-- The unique ID of Meir is 2.-- The unique ID of Winston is 3.-- The unique ID of Jonathan is 1.
-- Solution
select unique_id, name
from employees e
left join
employeeuni u
on e.id = u.id
order by e.id
35 Reported posts.sql
-- Table: Actions
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| user_id |int|--| post_id |int|--| action_date | date |--| action |enum|--| extra | varchar |--+---------------+---------+-- There is no primary key forthis table, it may have duplicate rows.-- The action column is an ENUM type of ('view','like','reaction','comment','report','share').-- The extra column has optional information about the action such as a reason for report or a type of reaction.-- Write an SQL query that reports the number of posts reported yesterday for each report reason. Assume today is 2019-07-05.-- The query result format is in the following example:-- Actions table:--+---------+---------+-------------+--------+--------+--| user_id | post_id | action_date | action | extra |--+---------+---------+-------------+--------+--------+--|1|1|2019-07-01| view | null |--|1|1|2019-07-01| like | null |--|1|1|2019-07-01| share | null |--|2|4|2019-07-04| view | null |--|2|4|2019-07-04| report | spam |--|3|4|2019-07-04| view | null |--|3|4|2019-07-04| report | spam |--|4|3|2019-07-02| view | null |--|4|3|2019-07-02| report | spam |--|5|2|2019-07-04| view | null |--|5|2|2019-07-04| report | racism |--|5|5|2019-07-04| view | null |--|5|5|2019-07-04| report | racism |--+---------+---------+-------------+--------+--------+-- Result table:--+---------------+--------------+--| report_reason | report_count |--+---------------+--------------+--| spam |1|--| racism |2|--+---------------+--------------+-- Note that we only care about report reasons with non zero number of reports.
-- Solution
Select extra as report_reason,count(distinct post_id) as report_count
from actions
where action_date =DATE_SUB("2019-07-5", INTERVAL 1 DAY) and action='report'
group by extra
36 Rising Temperature.sql
-- Given a Weather table, write a SQL query to find all dates' Ids with higher temperature compared to its previous (yesterday's) dates.--+---------+------------------+------------------+--|Id(INT)|RecordDate(DATE)|Temperature(INT)|--+---------+------------------+------------------+--|1|2015-01-01|10|--|2|2015-01-02|25|--|3|2015-01-03|20|--|4|2015-01-04|30|--+---------+------------------+------------------+-- For example,return the following Ids for the above Weather table:--+----+--| Id |--+----+--|2|--|4|--+----+
-- Solution
select a.Id
from weather a, weather b
where a.Temperature>b.Temperature and datediff(a.recorddate,b.recorddate)=1
datadiff(a,b)日期差函数
37 Sales Analysis 1.sql
-- Table: Product
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| product_id |int|--| product_name | varchar |--| unit_price |int|--+--------------+---------+-- product_id is the primary key of this table.-- Table: Sales
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| seller_id |int|--| product_id |int|--| buyer_id |int|--| sale_date | date |--| quantity |int|--| price |int|--+------------+---------+-- This table has no primary key, it can have repeated rows.-- product_id is a foreign key to Product table.-- Write an SQL query that reports the best seller by total sales price, If there is a tie, report them all.-- The query result format is in the following example:-- Product table:--+------------+--------------+------------+--| product_id | product_name | unit_price |--+------------+--------------+------------+--|1| S8 |1000|--|2| G4 |800|--|3| iPhone |1400|--+------------+--------------+------------+-- Sales table:--+-----------+------------+----------+------------+----------+-------+--| seller_id | product_id | buyer_id | sale_date | quantity | price |--+-----------+------------+----------+------------+----------+-------+--|1|1|1|2019-01-21|2|2000|--|1|2|2|2019-02-17|1|800|--|2|2|3|2019-06-02|1|800|--|3|3|4|2019-05-13|2|2800|--+-----------+------------+----------+------------+----------+-------+-- Result table:--+-------------+--| seller_id |--+-------------+--|1|--|3|--+-------------+-- Both sellers with id 1 and 3 sold products with the most total price of 2800.
-- Solution
Select a.seller_id
from
(select seller_id,rank()over(order by sum(price) desc) as rk
from sales
group by seller_id) a
where a.rk=1
-- Table: Product
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| product_id |int|--| product_name | varchar |--| unit_price |int|--+--------------+---------+-- product_id is the primary key of this table.-- Table: Sales
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| seller_id |int|--| product_id |int|--| buyer_id |int|--| sale_date | date |--| quantity |int|--| price |int|--+------------+---------+-- This table has no primary key, it can have repeated rows.-- product_id is a foreign key to Product table.-- Write an SQL query that reports the buyers who have bought S8 but not iPhone. Note that S8 and iPhone are products present in the Product table.-- The query result format is in the following example:-- Product table:--+------------+--------------+------------+--| product_id | product_name | unit_price |--+------------+--------------+------------+--|1| S8 |1000|--|2| G4 |800|--|3| iPhone |1400|--+------------+--------------+------------+-- Sales table:--+-----------+------------+----------+------------+----------+-------+--| seller_id | product_id | buyer_id | sale_date | quantity | price |--+-----------+------------+----------+------------+----------+-------+--|1|1|1|2019-01-21|2|2000|--|1|2|2|2019-02-17|1|800|--|2|1|3|2019-06-02|1|800|--|3|3|3|2019-05-13|2|2800|--+-----------+------------+----------+------------+----------+-------+-- Result table:--+-------------+--| buyer_id |--+-------------+--|1|--+-------------+-- The buyer with id 1 bought an S8 but didn't buy an iPhone. The buyer with id 3 bought both.
-- Solution
Select distinct a.buyer_id
from sales a join
product b
on a.product_id = b.product_id
where a.buyer_id in
(Select a.buyer_id from sales a join product b on a.product_id = b.product_id where b.product_name ='S8')
and
a.buyer_id not in (Select a.buyer_id from sales a join product b on a.product_id = b.product_id where b.product_name ='iPhone')
39 Sales Analysis 3.sql
-- Table: Product
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| product_id |int|--| product_name | varchar |--| unit_price |int|--+--------------+---------+-- product_id is the primary key of this table.-- Table: Sales
--+-------------+---------+--| Column Name | Type |--+-------------+---------+--| seller_id |int|--| product_id |int|--| buyer_id |int|--| sale_date | date |--| quantity |int|--| price |int|--+------------+---------+-- This table has no primary key, it can have repeated rows.-- product_id is a foreign key to Product table.-- Write an SQL query that reports the products that were only sold in spring 2019. That is, between 2019-01-01 and 2019-03-31 inclusive.-- The query result format is in the following example:-- Product table:--+------------+--------------+------------+--| product_id | product_name | unit_price |--+------------+--------------+------------+--|1| S8 |1000|--|2| G4 |800|--|3| iPhone |1400|--+------------+--------------+------------+-- Sales table:--+-----------+------------+----------+------------+----------+-------+--| seller_id | product_id | buyer_id | sale_date | quantity | price |--+-----------+------------+----------+------------+----------+-------+--|1|1|1|2019-01-21|2|2000|--|1|2|2|2019-02-17|1|800|--|2|2|3|2019-06-02|1|800|--|3|3|4|2019-05-13|2|2800|--+-----------+------------+----------+------------+----------+-------+-- Result table:--+-------------+--------------+--| product_id | product_name |--+-------------+--------------+--|1| S8 |--+-------------+--------------+-- The product with id 1 was only sold in spring 2019while the other two were sold after.
-- Solution
select distinct a.product_id, product_name from sales a join product b on a.product_id = b.product_id where a.product_id
in
(select product_id from sales where sale_date >='2019-01-01' and sale_date <='2019-03-31')
and
a.product_id not in
(select product_id from sales where sale_date >'2019-03-31' or sale_date <'2019-01-01')
40 Sales Person.sql
-- Description
-- Given three tables: salesperson, company, orders.-- Output all the names in the table salesperson, who didn’t have sales to company 'RED'.-- Example
-- Input
-- Table: salesperson
--+----------+------+--------+-----------------+-----------+--| sales_id | name | salary | commission_rate | hire_date |--+----------+------+--------+-----------------+-----------+--|1| John |100000|6|4/1/2006|--|2| Amy |120000|5|5/1/2010|--|3| Mark |65000|12|12/25/2008|--|4| Pam |25000|25|1/1/2005|--|5| Alex |50000|10|2/3/2007|--+----------+------+--------+-----------------+-----------+-- The table salesperson holds the salesperson information. Every salesperson has a sales_id and a name.-- Table: company
--+---------+--------+------------+--| com_id | name | city |--+---------+--------+------------+--|1| RED | Boston |--|2| ORANGE | New York|--|3| YELLOW | Boston |--|4| GREEN | Austin |--+---------+--------+------------+-- The table company holds the company information. Every company has a com_id and a name.-- Table: orders
--+----------+------------+---------+----------+--------+--| order_id | order_date | com_id | sales_id | amount |--+----------+------------+---------+----------+--------+--|1|1/1/2014|3|4|100000|--|2|2/1/2014|4|5|5000|--|3|3/1/2014|1|1|50000|--|4|4/1/2014|1|4|25000|--+----------+----------+---------+----------+--------+-- The table orders holds the sales record information, salesperson and customer company are represented by sales_id and com_id.-- output
--+------+--| name |--+------+--| Amy |--| Mark |--| Alex |--+------+-- Explanation
-- According to order '3' and '4' in table orders, it is easy to tell only salesperson 'John' and 'Pam' have sales to company 'RED',-- so we need to output all the other names in the table salesperson.
SELECT name
FROM salesperson
WHERE sales_id NOT IN (SELECT DISTINCT sales_id
FROM orders
WHERE com_id =(SELECT com_id
FROM company
WHERE name ='RED'));
41 Second highest salary.sql
-- Write a SQL query to get the second highest salary from the Employee table.--+----+--------+--| Id | Salary |--+----+--------+--|1|100|--|2|200|--|3|300|--+----+--------+-- For example, given the above Employee table, the query should return200 as the second highest salary.-- If there is no second highest salary, then the query should return null.--+---------------------+--| SecondHighestSalary |--+---------------------+--|200|--+---------------------+
-- Solution
select max(salary) as SecondHighestSalary
from employee
where salary !=(Select max(salary)
from employee)2.
select ( select distinct Salary from Employee
order by Salary desc
limit 1 offset 1)
as SecondHighestSalary;
1.limit :(start, count)
start:从第几行的下一行开始找
count:找几个
2.limit a offset b
他代表的意思是跳过b条数据后查询a条
42 Shortest Distance.sql
-- Table point holds the x coordinate of some points on x-axis in a plane, which are all integers.-- Write a query to find the shortest distance between two points in these points.--| x |--|-----|--|-1|--|0|--|2|-- The shortest distance is '1' obviously, which is from point '-1' to '0'. So the output is as below:--| shortest|--|---------|--|1|-- Note: Every point is unique, which means there is no duplicates in table point
-- Solution
select min(abs(abs(a.x)-abs(a.next_closest))) as shortest
from(
select *,lead(x)over(order by x) as next_closest
from point) a
43 Students and Examinations.sql
-- Table: Students
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| student_id |int|--| student_name | varchar |--+---------------+---------+-- student_id is the primary key forthis table.-- Each row of this table contains the ID and the name of one student in the school.-- Table: Subjects
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| subject_name | varchar |--+--------------+---------+-- subject_name is the primary key forthis table.-- Each row of this table contains the name of one subject in the school.-- Table: Examinations
--+--------------+---------+--| Column Name | Type |--+--------------+---------+--| student_id |int|--| subject_name | varchar |--+--------------+---------+-- There is no primary key forthis table. It may contain duplicates.-- Each student from the Students table takes every course from Subjects table.-- Each row of this table indicates that a student with ID student_id attended the exam of subject_name.-- Write an SQL query to find the number of times each student attended each exam.-- Order the result table by student_id and subject_name.-- The query result format is in the following example:-- Students table:--+------------+--------------+--| student_id | student_name |--+------------+--------------+--|1| Alice |--|2| Bob |--|13| John |--|6| Alex |--+------------+--------------+-- Subjects table:--+--------------+--| subject_name |--+--------------+--| Math |--| Physics |--| Programming |--+--------------+-- Examinations table:--+------------+--------------+--| student_id | subject_name |--+------------+--------------+--|1| Math |--|1| Physics |--|1| Programming |--|2| Programming |--|1| Physics |--|1| Math |--|13| Math |--|13| Programming |--|13| Physics |--|2| Math |--|1| Math |--+------------+--------------+-- Result table:--+------------+--------------+--------------+----------------+--| student_id | student_name | subject_name | attended_exams |--+------------+--------------+--------------+----------------+--|1| Alice | Math |3|--|1| Alice | Physics |2|--|1| Alice | Programming |1|--|2| Bob | Math |1|--|2| Bob | Physics |0|--|2| Bob | Programming |1|--|6| Alex | Math |0|--|6| Alex | Physics |0|--|6| Alex | Programming |0|--|13| John | Math |1|--|13| John | Physics |1|--|13| John | Programming |1|--+------------+--------------+--------------+----------------+-- The result table should contain all students and all subjects.-- Alice attended Math exam 3 times, Physics exam 2 times and Programming exam 1 time.-- Bob attended Math exam 1 time, Programming exam 1 time and didn't attend the Physics exam.-- Alex didn't attend any exam.-- John attended Math exam 1 time, Physics exam 1 time and Programming exam 1 time.
-- Solution
Select a.student_id as student_id, a.student_name as student_name, a.subject_name as subject_name,coalesce(attended_exams,0) as attended_exams
from(
select *
from students
cross join subjects
group by student_id, student_name, subject_name) a
left join
(Select e.student_id, student_name, subject_name,count(*) as attended_exams
from examinations e join students s
on e.student_id = s.student_id
group by e.student_id, student_name, subject_name) b
on a.student_id = b.student_id and a.subject_name =b.subject_name
order by a.student_id asc, a.subject_name asc
44 Students with invalid departments.sql
-- Table: Departments
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| name | varchar |--+---------------+---------+-- id is the primary key of this table.-- The table has information about the id of each department of a university.-- Table: Students
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| name | varchar |--| department_id |int|--+---------------+---------+-- id is the primary key of this table.-- The table has information about the id of each student at a university and the id of the department he/she studies at.-- Write an SQL query to find the id and the name of all students who are enrolled in departments that no longer exists.-- Return the result table in any order.-- The query result format is in the following example:-- Departments table:--+------+--------------------------+--| id | name |--+------+--------------------------+--|1| Electrical Engineering |--|7| Computer Engineering |--|13| Bussiness Administration |--+------+--------------------------+-- Students table:--+------+----------+---------------+--| id | name | department_id |--+------+----------+---------------+--|23| Alice |1|--|1| Bob |7|--|5| Jennifer |13|--|2| John |14|--|4| Jasmine |77|--|3| Steve |74|--|6| Luis |1|--|8| Jonathan |7|--|7| Daiana |33|--|11| Madelynn |1|--+------+----------+---------------+-- Result table:--+------+----------+--| id | name |--+------+----------+--|2| John |--|7| Daiana |--|4| Jasmine |--|3| Steve |--+------+----------+-- John, Daiana, Steve and Jasmine are enrolled in departments 14,33,74 and 77 respectively.-- department 14,33,74 and 77 doesn't exist in the Departments table.
-- Solution
Select s.id, s.name
from students s left join
departments d
on s.department_id = d.id
where d.name is null
45 Swap Salary.sql
-- Given a table salary, such as the one below, that has m=male and f=female values.-- Swap all f and m values (i.e., change all f values to m and vice versa) with
-- a single update statement and no intermediate temp table.-- Note that you must write a single update statement, DO NOT write any select statement forthis problem.-- Example:--| id | name | sex | salary |--|----|------|-----|--------|--|1| A | m |2500|--|2| B | f |1500|--|3| C | m |5500|--|4| D | f |500|-- After running your update statement, the above salary table should have the following rows:--| id | name | sex | salary |--|----|------|-----|--------|--|1| A | f |2500|--|2| B | m |1500|--|3| C | f |5500|--|4| D | m |500|
-- Solution
Update salary
set sex = Case when sex ='m' then 'f'
when sex ='f' then 'm'
end;
46 Top Travellers.sql
-- Table: Users
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| name | varchar |--+---------------+---------+-- id is the primary key forthis table.-- name is the name of the user.-- Table: Rides
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| id |int|--| user_id |int|--| distance |int|--+---------------+---------+-- id is the primary key forthis table.-- user_id is the id of the user who travelled the distance "distance".-- Write an SQL query to report the distance travelled by each user.-- Return the result table ordered by travelled_distance in descending order,--if two or more users travelled the same distance, order them by their name in ascending order.-- The query result format is in the following example.-- Users table:--+------+-----------+--| id | name |--+------+-----------+--|1| Alice |--|2| Bob |--|3| Alex |--|4| Donald |--|7| Lee |--|13| Jonathan |--|19| Elvis |--+------+-----------+-- Rides table:--+------+----------+----------+--| id | user_id | distance |--+------+----------+----------+--|1|1|120|--|2|2|317|--|3|3|222|--|4|7|100|--|5|13|312|--|6|19|50|--|7|7|120|--|8|19|400|--|9|7|230|--+------+----------+----------+-- Result table:--+----------+--------------------+--| name | travelled_distance |--+----------+--------------------+--| Elvis |450|--| Lee |450|--| Bob |317|--| Jonathan |312|--| Alex |222|--| Alice |120|--| Donald |0|--+----------+--------------------+-- Elvis and Lee travelled 450 miles, Elvis is the top traveller as his name is alphabetically smaller than Lee.-- Bob, Jonathan, Alex and Alice have only one ride and we just order them by the total distances of the ride.-- Donald didn't have any rides, the distance travelled by him is 0.
-- Solution
Select U.name as name,coalesce(sum(R.distance),0) as travelled_distance
from Users U left join Rides R
on R.user_id = U.id
group by R.user_id
Order by travelled_distance desc, name
47 Triangle Judgement.sql
-- A pupil Tim gets homework to identify whether three line segments could possibly form a triangle.-- However,this assignment is very heavy because there are hundreds of records to calculate.-- Could you help Tim by writing a query to judge whether these three sides can form a triangle,-- assuming table triangle holds the length of the three sides x, y and z.--| x | y | z |--|----|----|----|--|13|15|30|--|10|20|15|-- For the sample data above, your query should return the follow result:--| x | y | z | triangle |--|----|----|----|----------|--|13|15|30| No |--|10|20|15| Yes |
-- Solution
select x, y, z,case
when x+y > z and x+z > y and y+z > x then 'Yes'
when x=y and y=z then 'Yes'else'No'
end as Triangle
from triangle
48 User activity for past 30 days 1.sql
-- Table: Activity
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| user_id |int|--| session_id |int|--| activity_date | date |--| activity_type |enum|--+---------------+---------+-- There is no primary key forthis table, it may have duplicate rows.-- The activity_type column is an ENUM of type ('open_session','end_session','scroll_down','send_message').-- The table shows the user activities for a social media website.-- Note that each session belongs to exactly one user.-- Write an SQL query to find the daily active user count for a period of 30 days ending 2019-07-27 inclusively. A user was active on some day if he/she made at least one activity on that day.-- The query result format is in the following example:-- Activity table:--+---------+------------+---------------+---------------+--| user_id | session_id | activity_date | activity_type |--+---------+------------+---------------+---------------+--|1|1|2019-07-20| open_session |--|1|1|2019-07-20| scroll_down |--|1|1|2019-07-20| end_session |--|2|4|2019-07-20| open_session |--|2|4|2019-07-21| send_message |--|2|4|2019-07-21| end_session |--|3|2|2019-07-21| open_session |--|3|2|2019-07-21| send_message |--|3|2|2019-07-21| end_session |--|4|3|2019-06-25| open_session |--|4|3|2019-06-25| end_session |--+---------+------------+---------------+---------------+-- Result table:--+------------+--------------+--| day | active_users |--+------------+--------------+--|2019-07-20|2|--|2019-07-21|2|--+------------+--------------+-- Note that we do not care about days with zero active users.
-- Solution
Select activity_date as day,count(distinct user_id) as active_users
from activity
where activity_date >'2019-06-26' and activity_date <'2019-07-27'
group by activity_date
49 User Activity for past 30 days 2.sql
-- Table: Activity
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| user_id |int|--| session_id |int|--| activity_date | date |--| activity_type |enum|--+---------------+---------+
该表没有主键,它可能有重复的行。
activity_type列是一种类型的ENUM(“ open_session”,“ end_session”,“ scroll_down”,“ send_message”)。
该表显示了社交媒体网站的用户活动。
请注意,每个会话完全属于一个用户。
编写SQL查询以查找截至2019年7月27日(含)的30天内每个用户的平均会话数,四舍五入到小数点后两位。我们要为用户计算的会话是在该时间段内至少进行了一项活动的会话。
-- Write an SQL query to find the average number of sessions per user for a period of 30 days ending 2019-07-27 inclusively, rounded to 2 decimal places. The sessions we want to count for a user are those with at least one activity in that time period.-- The query result format is in the following example:-- Activity table:--+---------+------------+---------------+---------------+--| user_id | session_id | activity_date | activity_type |--+---------+------------+---------------+---------------+--|1|1|2019-07-20| open_session |--|1|1|2019-07-20| scroll_down |--|1|1|2019-07-20| end_session |--|2|4|2019-07-20| open_session |--|2|4|2019-07-21| send_message |--|2|4|2019-07-21| end_session |--|3|2|2019-07-21| open_session |--|3|2|2019-07-21| send_message |--|3|2|2019-07-21| end_session |--|3|5|2019-07-21| open_session |--|3|5|2019-07-21| scroll_down |--|3|5|2019-07-21| end_session |--|4|3|2019-06-25| open_session |--|4|3|2019-06-25| end_session |--+---------+------------+---------------+---------------+-- Result table:--+---------------------------+--| average_sessions_per_user |--+---------------------------+--|1.33|--+---------------------------+-- User 1 and 2 each had 1 session in the past 30 days while user 3 had 2 sessions so the average is (1+1+2)/3=1.33.
select ifnull(round(avg(a.num),2),0) as average_sessions_per_user
from (
select count(distinct session_id) as num
from activity
where activity_date between '2019-06-28' and '2019-07-27'
group by user_id) a
50 Weather type in each country.sql
-- Question 46-- Table: Countries
--+---------------+---------+--| Column Name | Type |--+---------------+---------+--| country_id |int|--| country_name | varchar |--+---------------+---------+-- country_id is the primary key forthis 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 | varchar |--| day | date |--+---------------+---------+--(country_id, day) is the primary key forthis table.-- Each row of this table indicates the weather state in a country for one day.-- Write an SQL query 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 25 and Warm otherwise.-- Return result table in any order.-- The query result format is in the following example:-- Countries table:--+------------+--------------+--| country_id | country_name |--+------------+--------------+--|2| USA |--|3| Australia |--|7| Peru |--|5| China |--|8| Morocco |--|9| Spain |--+------------+--------------+-- Weather table:--+------------+---------------+------------+--| country_id | weather_state | day |--+------------+---------------+------------+--|2|15|2019-11-01|--|2|12|2019-10-28|--|2|12|2019-10-27|--|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|--|7|22|2019-12-01|--|7|20|2019-12-02|--|8|25|2019-11-05|--|8|27|2019-11-15|--|8|31|2019-11-25|--|9|7|2019-10-23|--|9|3|2019-12-23|--+------------+---------------+------------+-- Result table:--+--------------+--------------+--| country_name | weather_type |--+--------------+--------------+--| USA | Cold |--| Austraila | Cold |--| Peru | Hot |--| China | Warm |--| Morocco | Hot |--+--------------+--------------+-- Average weather_state in USA in November is (15)/1=15 so weather type is Cold.-- Average weather_state in Austraila in November is (-2+0+3)/3=0.333 so weather type is Cold.-- Average weather_state in Peru in November is (25)/1=25 so weather type is Hot.-- Average weather_state in China in November is (16+18+21)/3=18.333 so weather type is Warm.-- Average weather_state in Morocco in November is (25+27+31)/3=27.667 so weather type is Hot.-- We know nothing about average weather_state in Spain in November
-- so we don't include it in the result table.
-- Solution
Select c.country_name,case when avg(w.weather_state)<=15 then 'Cold'
when avg(w.weather_state)>=25 then 'Hot'else'Warm'
end as weather_type
from weather w join
countries c
on w.country_id = c.country_id
where month(day)=11
group by c.country_name