返回介绍

solution / 0600-0699 / 0618.Students Report By Geography / README

发布于 2024-06-17 01:03:36 字数 2056 浏览 0 评论 0 收藏 0

618. 学生地理信息报告

English Version

题目描述

表: 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   |
+---------+------+--------+

 

进阶:如果不能确定哪个大洲的学生数最多,你可以写出一个查询去生成上述学生报告吗?

解法

方法一:窗口函数 + GROUP BY

我们可以使用窗口函数 row_number() 来为每个大洲的学生编号,然后使用 GROUP BY 来将同一编号的学生聚合到一行中。

# Write your MySQL query statement below
WITH
  T AS (
    SELECT
      *,
      ROW_NUMBER() OVER (
        PARTITION BY continent
        ORDER BY name
      ) AS rk
    FROM Student
  )
SELECT
  MAX(IF(continent = 'America', name, NULL)) AS 'America',
  MAX(IF(continent = 'Asia', name, NULL)) AS 'Asia',
  MAX(IF(continent = 'Europe', name, NULL)) AS 'Europe'
FROM T
GROUP BY rk;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文