You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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;

逻辑说明

  1. 内层查询通过PARTITION BY Name按姓名分组,ORDER BY taskName确保每个分组内的记录顺序(如A的AA、AB、AC依次排序),利用ROW_NUMBER()生成组内序号row_num
  2. 外层查询先按row_num升序,保证先输出所有分组的第一条记录,再输出第二条,以此类推;再按issueDate降序,让同序号的记录按日期从新到旧排列

内容的提问来源于stack exchange,提问作者Iftakhar Ahmed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 13:45:42