1. 题目
-
题目描述
在不打乱原序列顺序的情况下,输出:按first_name排升序后,取奇数行的first_name -
一张表
# employees 10001|1953-09-02|Georgi|Facello|M|1986-06-26 10002|1964-06-02|Bezalel|Simmel|F|1985-11-21 10005|1955-01-21|Kyoichi|Maliniak|M|1989-09-12 10006|1953-04-20|Anneke|Preusig|F|1989-06-02 -
所需结果
Georgi Anneke
2. 题解
这题有点小问题,题目要求结果的排序按照原表来,但是使用了窗口函数后顺序居然改变了,导致不通过(如下)。
SELECT t.first_name
FROM(SELECT *,
ROW_NUMBER() OVER(ORDER BY first_name) rk
FROM employees
) t
WHERE t.rk % 2 != 0
后来有人说可以使用IN,使用子查询 对first_name进行过滤:
# 正解
SELECT first_name
FROM employees
WHERE first_name IN (SELECT t.first_name
FROM(SELECT *,
ROW_NUMBER() OVER(ORDER BY first_name) rk
FROM employees) t
WHERE t.rk % 2 != 0)
注意下这题的需求:排序不变!,
以及从窗口函数子查询中取取数据会改变原有的排序顺序。
该博客讨论了一道SQL题目,要求从employees表中按first_name升序排列并只选取奇数行的first_name,同时保持原有顺序。文中提到初试解决方案使用窗口函数ROW_NUMBER()可能导致排序变化,最终采用子查询结合IN操作符的正解来满足需求。此问题强调了在使用窗口函数时需注意保持原始排序的重要性。
516

被折叠的 条评论
为什么被折叠?



