通过供应商ID获取最新的3个订单

时间:2018-12-19 16:43:47

标签: sql sql-server

我有以下SQL Server代码,可以从4个表的组合中获取信息。

我想对其进行修改,以仅检索供应商(pmpOrderDate)的最新3个订单(pmpSupplierOrganizationID)。

SELECT 
    PO.pmpPurchaseOrderID, PO.pmpOrderDate, PO.pmpSupplierOrganizationID, O.cmoName
FROM 
    PurchaseOrders PO 
INNER JOIN 
    PurchaseOrderLines POL ON PO.pmpPurchaseOrderID = POL.pmlPurchaseOrderID 
INNER JOIN 
    Organizations O ON PO.pmpSupplierOrganizationID = O.cmoOrganizationID 
INNER JOIN 
    Parts P ON POL.pmlPartID = P.impPartID
WHERE 
    P.impPartClassID LIKE 'PUMP%'

可以帮忙吗?

编辑:

我对我的实际要求不完全清楚。为了进一步阐明,我最后需要的是显示基于供应商ID的最新3个唯一的采购订单,该订单基于PurchaseOrderLines中PartID的PartClassID的至少一个,具有以字符串'PUMP'开头的条件

3 个答案:

答案 0 :(得分:2)

使用ROW_NUMBER按pmpSupplierOrganizationID进行分区,并按pmpOrderDate进行排序。

with cteTopOrders AS (
    SELECT PO.pmpPurchaseOrderID, PO.pmpOrderDate, PO.pmpSupplierOrganizationID, O.cmoName,
           ROW_NUMBER() OVER(PARTITION BY pmpSupplierOrganizationID ORDER BY pmpOrderDate DESC) AS RowNum
    FROM PurchaseOrders PO 
    Inner Join  PurchaseOrderLines POL ON PO.pmpPurchaseOrderID = POL.pmlPurchaseOrderID 
    Inner Join Organizations O On PO.pmpSupplierOrganizationID = O.cmoOrganizationID 
    Inner Join  Parts P ON POL.pmlPartID = P.impPartID
    WHERE P.impPartClassID Like 'PUMP%'
)
SELECT pmpPurchaseOrderID, pmpOrderDate, pmpSupplierOrganizationID, cmoName
    FROM cteTopOrders
    WHERE RowNum <= 3;

答案 1 :(得分:0)

您需要一个嵌套的row_number才能使每个供应商获得三行,并在其顶部获得另一个OLAP函数:

with OrderRowNum as
 (

    SELECT PO.pmpPurchaseOrderID, PO.pmpOrderDate, PO.pmpSupplierOrganizationID, O.cmoName, P.impPartClassID,
       row_number()
       over (partition by PO.pmpSupplierOrganizationID
             order by pmpOrderDate desc) as rn
    FROM PurchaseOrders PO 
    Inner Join  PurchaseOrderLines POL ON PO.pmpPurchaseOrderID = POL.pmlPurchaseOrderID 
    Inner Join Organizations O On PO.pmpSupplierOrganizationID = O.cmoOrganizationID 
    Inner Join  Parts P ON POL.pmlPartID = P.impPartID
 )
, CheckPUMP as
 (
   select *,
      -- check if at least one of the three rows contains PUMP
      max(case when impPartClassID Like 'PUMP%' then 1 else 0 end)
      over (partition by PO.pmpSupplierOrganizationID) as PUMPflag
   from OrderRowNum
   where rn <= 3 -- get the last three rows per supplier
 )
select * 
from CheckPUMP
where flag = 1

答案 2 :(得分:0)

为此,我非常喜欢横向连接。 。 。 cross apply

select p.*, O.cmoName
from Organizations O cross apply
     (select top (3) PO.pmpPurchaseOrderID, PO.pmpOrderDate, PO.pmpSupplierOrganizationID
      from PurchaseOrders PO join
           PurchaseOrderLines POL 
           on PO.pmpPurchaseOrderID = POL.pmlPurchaseOrderID join
           Parts P
           on POL.pmlPartID = P.impPartID
      where PO.pmpSupplierOrganizationID = O.cmoOrganizationID and
            P.impPartClassID Like 'PUMP%'
      order by PO.pmpOrderDate desc
     ) p