如何编写SQL按issueTime降序先展示各Name的首个值,再依次展示后续值?
需求与SQL实现方案
现有表结构及数据
表名:tasks
+---------+-------------+-------------+ | Name | taskName | issueDate | +---------+-------------+-------------+ | A | AA | 4/11/2022 | | A | AB | 4/11/2022 | | A | AC | 4/11/2022 | | B | BA | 3/11/2022 | | B | BB | 3/11/2022 | | B | BC | 3/11/2022 | | C | CA | 2/11/2022 | | C | CB | 2/11/2022 | +---------+-------------+-------------+
期望结果
+---------+-------------+-------------+ | Name | taskName | issueTime | +---------+-------------+-------------+ | A | AA | 4/11/2022 | | B | BA | 3/11/2022 | | C | CA | 2/11/2022 | | A | AB | 4/11/2022 | | B | BB | 3/11/2022 | | C | CB | 2/11/2022 | | A | AC | 4/11/2022 | | B | BC | 3/11/2022 | +---------+-------------+-------------+
注:原需求给出的期望结果最后一行存在笔误,根据原始数据修正为B/BC记录
需求说明
需按以下规则排序输出数据:
- 先按
issueDate降序,展示每个Name的第一条记录 - 接着依次展示所有
Name的第二条、第三条……记录,即按每个Name分组内的记录序号升序排列,同序号的记录按issueDate降序排列
SQL实现代码
使用窗口函数ROW_NUMBER()为每个Name分组内的记录分配序号,再按指定规则排序:
SELECT Name, taskName, issueDate AS issueTime FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Name ORDER BY taskName) AS row_num FROM tasks ) t ORDER BY row_num ASC, issueDate DESC;
逻辑说明
- 内层查询通过
PARTITION BY Name按姓名分组,ORDER BY taskName确保每个分组内的记录顺序(如A的AA、AB、AC依次排序),利用ROW_NUMBER()生成组内序号row_num - 外层查询先按
row_num升序,保证先输出所有分组的第一条记录,再输出第二条,以此类推;再按issueDate降序,让同序号的记录按日期从新到旧排列
内容的提问来源于stack exchange,提问作者Iftakhar Ahmed
相关产品推荐
相关产品推荐

