SQL将一个表中的值匹配到另一个表中的最高值以从另一个表中提取日期

时间:2014-08-26 16:27:31

标签: sql sql-server

我正在尝试确定上次收到库存商品的时间,并且只显示此日期以及每个库存商品,但我还需要提取其他信息,例如仓库名称。

我使用下表:

  • 广告资源:包含广告资源计数
  • Part_Info :包含零件信息(说明,仓库标识符)
  • Warehouse_Info :包含仓库名称
  • Received_Parts :包含所有收到的部分的日记,但不包含日期信息。
  • Receive_Master :包含接收ID的已接收部分的日期。

我的思考过程:

  • 通过PartID将库存加入Part_Info:这为我提供了零件的详细信息,名称和描述。
  • 通过WarehouseID将Inventory连接到Warehouse_Info:这会获取仓库名称。

然后我就会陷入困境。

Received_Parts已收到所有部分但没有日期信息。要获取日期信息,我需要通过Received_Parts_ID绑定到Receive_Master。

我原以为我可以通过MAX()函数获取特定PartID的最高receipt_parts_id,然后将其绑定到Receive_Master以拉出该特定条目的日期。

不幸的是,我所做的每次尝试都失败了。

这是我最近的尝试:

   select 
  a.*,
  b.*,
  c.*,
  d.*,
  e.*
FROM dbo.IN_Inventory a
    LEFT OUTER JOIN dbo.IN_Part b
        ON a.Part_Id = b.part_id
    LEFT OUTER JOIN IN_Warehouse c
        ON a.Warehouse_Id = c.Warehouse_Id
    INNER JOIN IN_Receipt_Parts d
        ON a.Part_Id = d.Part_Id
    INNER JOIN
    (
        SELECT part_id, receipt_id, MAX(receipt_parts_id) maxReceipt
        FROM IN_Receipt_Parts
        GROUP BY Part_Id
    ) e ON d.Part_Id = e.Part_Id AND d.Receipt_Parts_Id = e.maxReceipt
    LEFT OUTER JOIN IN_Receipt f
        ON e.Receipt_Id = f.Receipt_Id
WHERE
    a.On_Hand_New > 0

1 个答案:

答案 0 :(得分:0)

我认为这就是您所追求的(您从派生表中获取日期)。将“DateField”替换为您要查找的日期列。我不认为你在最近的尝试中引用过。

             select 
  a.*,
  b.*,
  c.*,
  e.*
FROM dbo.IN_Inventory a
    LEFT OUTER JOIN dbo.IN_Part b
        ON a.Part_Id = b.part_id
    LEFT OUTER JOIN IN_Warehouse c
        ON a.Warehouse_Id = c.Warehouse_Id
    INNER JOIN
    (
         SELECT p.part_id, m.DateField, Row_Number() OVER (PARTITION BY p.Part_Id ORDER BY m.DateField DESC) RowNumber
        FROM IN_Receipt_Parts p INNER JOIN 
            IN_Receipt  m ON p.receipt_id=m.Receipt_ID 
    ) e ON e.part_id=a.Part_id and RowNumber=1
WHERE
    a.On_Hand_New > 0