力扣sql刷题系列(三)

618. 学生地理信息报告
Create table If Not Exists Student (name varchar(50), continent varchar(7))
Truncate table Student
insert into Student (name, continent) values ('Jane', 'America')
insert into Student (name, continent) values ('Pascal', 'Europe')
insert into Student (name, continent) values ('Xi', 'Asia')
insert into Student (name, continent) values ('Jack', 'America')

表: student

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| name        | varchar |
| continent   | varchar |
+-------------+---------+
该表没有主键。它可能包含重复的行。
该表的每一行表示学生的名字和他们来自的大陆。

一所学校有来自亚洲、欧洲和美洲的学生。

写一个查询语句实现对大洲(continent)列的 透视表 操作,使得每个学生按照姓名的字母顺序依次排列在对应的大洲下面。输出的标题应依次为美洲(America)、亚洲(Asia)和欧洲(Europe)。

测试用例的生成使得来自美国的学生人数不少于亚洲或欧洲的学生人数。

查询结果格式如下所示。

示例 1:

输入: 
Student table:
+--------+-----------+
| name   | continent |
+--------+-----------+
| Jane   | America   |
| Pascal | Europe    |
| Xi     | Asia      |
| Jack   | America   |
+--------+-----------+
输出: 
+---------+------+--------+
| America | Asia | Europe |
+---------+------+--------+
| Jack    | Xi   | Pascal |
| Jane    | null | null   |
+---------+------+--------+

题解一:直接使用子查询

注意on后面要以第一个非null 为主就是t3这边

select
  America,
  Asia,
  Europe
from
  (
    select
      name as America,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'America'
  ) t1
  left join (
    select
      name as Asia,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'Asia'
  ) t2 on t1.rk = t2.rk
  left join (
    select
      name as Europe,
      row_number() over(
        order by
          name
      ) rk
    from
      student
    where
      continent = 'Europe'
  ) t3 on t1.rk = t3.rk;

题解二 换了一个排序思路

select
	America, Asia, Europe
from (select @america:=0, @europe:=0, @asia:=0) as init, (
	select
		name as America,
		@america:= @america + 1 as america_id
	from student where continent 

你可能感兴趣的:(面试,leetcode,sql,算法)