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

如何使用IN子句筛选订单表中各订单号的最新年度记录?

筛选指定订单号的最新年度记录

现有订单表orders结构如下:

create table orders (
    order_number varchar(6) NOT NULL,
    order_year year NOT NULL,
    ...
    primary key (order_number, order_year)
);

表中数据示例:

A111,2023,...
A111,2020,...
A222,2021,...

需求是从指定的订单号集合中,仅获取每个订单号对应order_year最新的记录。以下是几种可行的修改方案:

方案1:使用窗口函数(推荐,适用于支持窗口函数的数据库)

利用ROW_NUMBER()窗口函数按订单号分组,按年份降序排序后取每组第一条:

WITH ranked_orders AS (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY order_number ORDER BY order_year DESC) AS rn
    FROM orders
    WHERE order_number IN ('A111', 'A222', ...)
)
SELECT * FROM ranked_orders WHERE rn = 1;
  • 原理:PARTITION BY order_number将数据按订单号分组,ORDER BY order_year DESC让每个组内最新年份的记录排在最前面,rn=1筛选出每组的第一条(即最新年度记录)。

方案2:子查询关联(兼容不支持窗口函数的旧版本数据库)

先通过子查询获取每个指定订单号的最大年份,再关联原表获取完整记录:

SELECT o.*
FROM orders o
JOIN (
    SELECT order_number, MAX(order_year) AS latest_year
    FROM orders
    WHERE order_number IN ('A111', 'A222', ...)
    GROUP BY order_number
) AS latest 
ON o.order_number = latest.order_number AND o.order_year = latest.latest_year;

方案3:关联子查询筛选

在WHERE子句中通过子查询匹配当前订单号的最大年份:

SELECT *
FROM orders o
WHERE order_number IN ('A111', 'A222', ...)
AND order_year = (
    SELECT MAX(order_year)
    FROM orders
    WHERE order_number = o.order_number
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:17:03