首页 > 解决方案 > SQL 按最高日期返回行

问题描述

我在按产品数量的最大日期获取行时遇到问题

这是产品表

SupplierCode    Reference   Qty
1000            M131200     500
1111            M131200     1
1000            M131300     200
1111            M131300     500

这是订单表

SupplierCode    Reference   OrderDate
1000            M131200     2019-01-09 00:00:00.000
1111            M131200     2018-07-25 00:00:00.000
1000            M131200     2019-01-15 00:00:00.000
1000            M131200     2019-01-21 00:00:00.000
1111            M131200     2019-01-02 00:00:00.000
1111            M131300     2019-02-05 00:00:00.000
1000            M131300     2019-03-05 00:00:00.000
1000            M131300     2019-04-07 00:00:00.000
1111            M131300     2019-02-04 00:00:00.000

我只需要返回每个参考的产品数量,以便我可以加入另一个表。问题是有不止一个供应商,所以引用会在我的最终查询中产生重复的结果,因为一个引用可以有多个供应商。

我设法获得了每个供应商的最新日期

SELECT
    O.SupplierCode,
    O.Reference,
    MAX(OrderDate) AS Date
FROM 
    Orders O
GROUP BY 
    O.SupplierCode,
    O.Reference

返回这个

SupplierCode    Reference   Date
1000            M131200     2019-01-21 00:00:00.000
1111            M131200     2019-01-02 00:00:00.000
1000            M131300     2019-04-07 00:00:00.000
1111            M131300     2019-02-05 00:00:00.000

所以现在我需要为每个参考选择最新日期的供应商

例如,我正在寻找的最终输出是这样的,当然加入两个表会更快:

SupplierCode    Reference   Qty Date
1000            M131200     500 2019-01-21 00:00:00.000
1000            M131300     200 2019-04-07 00:00:00.000

但我不确定我应该如何对where条款进行日期验证

标签: sql-server

解决方案


您可以使用 ROW_NUMBER() 为每个参考选择最新的供应商:

with maxOrder as 
(
    select
        *
        , ROW_NUMBER() OVER (PARTITION BY Reference ORDER BY OrderDate DESC) as number
    from Orders
)
Select
     o.SupplierCode
    ,o.Reference
    ,p.Qty
    ,o.OrderDate
from maxOrder as o
join Products as p
    on p.SupplierCode = o.SupplierCode
    and p.Reference = o.Reference
where o.number = 1

推荐阅读