mysql Hackerrank SQL挑战:职业

gwbalxhn  于 2023-05-28  发布在  Mysql
关注(0)|答案(1)|浏览(187)

透视OCCUPATIONS中的Occupation列,以便每个Name按字母顺序排序并显示在其对应的Occupation下面。输出列标题应该分别为Doctor、Professor、Singer和Actor。
注:当没有更多的名称对应于某个职业时,打印NULL。
输入格式
OCCUPATIONS表描述如下:
Occupation将仅包含以下值之一:医生、教授、歌手或演员。
样品输入
样本输出
Jenny阿什利Meera Jane Samantha Christeen Priya Julia NULL Ketty NULL Maria解释
第一列是按字母顺序排列的医生姓名列表。第二列是按字母顺序排列的教授姓名列表。第三列是按字母顺序排列的歌手姓名列表。第四列是按字母顺序排列的Actor名称列表。对于小于每个职业的最大姓名数的列(在本例中为Professor和Actor列),空单元格数据将填充NULL值。
在互联网上搜索和学习后,使用MYSQL的正确答案是:

SELECT MIN(IF(Occupation = 'Doctor',Name,NULL)),MIN(IF(Occupation = 'Professor',Name,NULL)),MIN(IF(Occupation = 'Singer',Name,NULL)),MIN(IF(Occupation = 'Actor',Name,NULL)) 
FROM(
    SELECT ROW_NUMBER() OVER(PARTITION BY Occupation
                             ORDER BY Name) AS row_num,
            Name, 
            Occupation
    FROM OCCUPATIONS) AS ord
GROUP BY row_num

我的问题是函数MIN在这段代码中做了什么。此外,在将MIN更改为MAX后,答案仍然正确,但如果我删除MIN或MAX,则答案错误。

cygmwpex

cygmwpex1#

解决方案由MS SQL Server选择医生,教授,歌手,演员从(SELECT name,occupation,ROW_NUMBER()OVER(PARTITION BY occupation ORDER BY name)AS row_number FROM OCCUPATIONS)dt PIVOT(MAX(name)FOR [Occupation] IN([Doctor],[Professor],[Singer],[Actor]))pt ORDER BY row_number;

相关问题