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

SQL Server 2017如何获取每种物料的最新3条订单数据

问题:SQL Server 2017中获取每种物料的最新3条订单

现有数据表

orders表

ORDERNOORDER_DATEMAT1Menge
391209-09-1996 00:00:0011020
303917-07-1995 00:00:00130000
298527-06-1995 00:00:001100000
287920-04-1995 00:00:001100000
273506-02-1995 00:00:001100000
300029-06-1995 00:00:00230000
298627-06-1995 00:00:002100000
292718-05-1995 00:00:002100000
279408-03-1995 00:00:002100000
273807-02-1995 00:00:002100000
265206-01-1995 00:00:00230000
308209-08-1995 00:00:00330000
271731-01-1995 00:00:00330000
80628-10-1991 00:00:00320000
69302-07-1991 00:00:00315000
2900813-02-2023 09:02:024324000
2887107-12-2022 10:27:124580000
2878703-11-2022 13:46:424300000
2872612-10-2022 09:28:184580000
2867607-09-2022 11:33:534580000
2866131-08-2022 15:26:444360000

materials表

nrpriceweight
10.97970.0740
20.00000.0000
30.09190.0740
40.00000.0850

期望结果

nrpriceweightORDERNOORDER_DATEMAT1Menge
10.97970.0740391209-09-1996 00:00:0011020
10.97970.0740303917-07-1995 00:00:00130000
10.97970.0740298527-06-1995 00:00:001100000
20.00000.0000300029-06-1995 00:00:00230000
20.00000.0000298627-06-1995 00:00:002100000
20.00000.0000292718-05-1995 00:00:002100000

已尝试代码(获取单条最新订单)

select
   *
from
    Material m
join (
    select
        o.ORDERNO,
        max(o.ORDER_DATE) as ORDER_DATE,
        o.MAT1, 
        o.Menge
    from
        orders o
    group by
        o.ORDERNO,
        o.MAT1,
        o.Menge) as t1 on
    t1.MAT1 = m.NR

解决方案

在SQL Server中,使用窗口函数ROW_NUMBER()可以轻松实现分组取前N条数据的需求,具体代码如下:

SELECT 
    m.nr,
    m.price,
    m.weight,
    o.ORDERNO,
    o.ORDER_DATE,
    o.MAT1,
    o.Menge
FROM 
    materials m
INNER JOIN (
    SELECT 
        *,
        -- 按物料分组,按订单日期降序编号,每组内最新的订单排第1
        ROW_NUMBER() OVER (PARTITION BY MAT1 ORDER BY ORDER_DATE DESC) AS row_num
    FROM 
        orders
) o ON m.nr = o.MAT1
WHERE 
    o.row_num <= 3 -- 筛选每组内前3条最新订单
ORDER BY 
    m.nr, o.row_num; -- 按物料编号和行号排序,确保结果顺序符合预期

代码说明

  1. 子查询中通过PARTITION BY MAT1将订单按物料分组,ORDER BY ORDER_DATE DESC让每组内的订单按日期从新到旧排序,ROW_NUMBER()为每组内的订单分配唯一的行号。
  2. 关联materials表后,通过WHERE o.row_num <=3筛选出每组的前3条最新订单。
  3. 最后按物料编号和行号排序,保证结果的展示顺序和期望一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:34:58