+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。
Orders 表:
1 2 3 4 5 6 7 8 9
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | customerId | int | +-------------+------+ 在 SQL 中,id 是该表的主键。 customerId 是 Customers 表中 ID 的外键( Pandas 中的连接键)。 该表的每一行都表示订单的 ID 和订购该订单的客户的 ID。
找出所有从不点任何东西的顾客。
以 任意顺序 返回结果表。
1 2 3 4 5 6 7 8 9 10
select name Customers from Customers where Customers.id notin ( select customerId from Orders )
select name Customers from Customers leftjoin Orders on Customers.id = Orders.customerId where Orders.customerId isNull
第二高的薪水
Employee 表:
1 2 3 4 5 6 7 8
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | salary | int | +-------------+------+ 在 SQL 中,id 是这个表的主键。 表的每一行包含员工的工资信息。
select ifnull( (selectmax(distinct salary) SecondHighestSalary from Employee where salary < ( selectmax(distinct salary) from Employee )), null) as SecondHighestSalary;
select ifnull( (selectdistinct salary SecondHighestSalary from Employee orderby salary desc limit 1, 1) ,null) as SecondHighestSalary;
分数排名
Scores表:
1 2 3 4 5 6 7 8
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | score | decimal | +-------------+---------+ 在 SQL 中,id 是该表的主键。 该表的每一行都包含了一场比赛的分数。Score 是一个有两位小数点的浮点值。
查询并对分数进行排序。排名按以下规则计算:
分数应按从高到低排列。
如果两个分数相等,那么两个分数的排名应该相同。
在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。
按 score 降序返回结果表。
1 2
select score, dense_rank() over(orderby score desc) as'rank' from Scores;
其他:
1 2 3 4 5 6 7 8 9 10 11
select score, rank() over(orderby score desc) as'rank' from Scores;
+-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | num | varchar | +-------------+---------+ 在 SQL 中,id 是该表的主键。 id 是一个自增列。
找出所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
1 2 3 4 5 6 7 8 9
selectdistinct a.num ConsecutiveNums from Logs a, Logs b, Logs c where a.id = b.id+1and b.id = c.id+1and a.num=b.num and a.num=c.num
selectdistinct num ConsecutiveNums from ( select num, row_number() over(orderby id) -row_number() over(partitionby num orderby id) as rk from Logs ) tmp_table groupby rk, num havingcount(*) >=3
-- 计算日活人数 select login_date, count(distinct user_id) DAU from login_table groupby login_date;
-- 计算次日留存率 select a.login_date, count(distinct b.login_date)/count(distinct a.login_date) 次日留存率 from login_table a leftjoin login_table b on datediff(a.login_date, b.login_date) =-1and a.user_id = b.user_id groupby a.login_date
-- 考虑新注册的留存率 selectdistinct reg_date, count(login_date)/count(reg_date) from ( selectdistinct user_id, a.login_date reg_date from login_table a leftjoin login_table b on b.login_date < a.login_date where b.login_date isNull ) reg_table leftjoin login_table on datediff(reg_table.reg_date, login_table.login_date) =-1and reg_table.user_id = login_table.user_id