SQL61 给出employees表中排名为奇数行的first_name

该博客讨论了一道SQL题目,要求从employees表中按first_name升序排列并只选取奇数行的first_name,同时保持原有顺序。文中提到初试解决方案使用窗口函数ROW_NUMBER()可能导致排序变化,最终采用子查询结合IN操作符的正解来满足需求。此问题强调了在使用窗口函数时需注意保持原始排序的重要性。

文章目录

1. 题目

  • 题目来源:SQL61 给出employees表中排名为奇数行的first_name

  • 题目描述
    在不打乱原序列顺序的情况下,输出:按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) 

注意下这题的需求:排序不变!
以及从窗口函数子查询中取取数据会改变原有的排序顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值