SQL按最高日期返回行

时间:2019-05-20 20:54:48

标签: sql-server

我无法按最大日期按行显示产品数量

这是“产品”表

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子句中进行此日期验证

1 个答案:

答案 0 :(得分:2)

您可以使用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