SQL练习61:对于employees表中,给出奇数行的first_name

SQL练习61:对于employees表中,给出奇数行的first_name

题目链接:牛客网

题目描述
对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name

CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
如,输入为:
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12');
INSERT INTO employees VALUES(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02');

输出格式:

first_name
Georgi
Anneke

因为Georgifirst_name排名为3,Annekefirst_name排名为1,所以会输出这2个,且输出时不需排序。


解法
此题理解起来有些绕,题目的意思是:先根据first_name进行升序排序,获得first_name为奇数的数据,再对照表按照表原来的顺序来输出这些奇数位的first_name。子查询使用窗口函数获得first_namerow_id(排序后的id)作为r表,将r表与employees表内连接,获取row_id % 2 = 1(奇数)的数据。

SELECT e.first_name
FROM employees e JOIN (SELECT first_name, rank() over(ORDER BY first_name) AS row_id 
                       FROM employees) r
                       ON e.first_name = r.first_name
WHERE row_id % 2 = 1

猜你喜欢

转载自blog.csdn.net/qq_43965708/article/details/113791098