提前道歉,这可能是一个非常愚蠢的问题,但是在使用Crystal Reports多年后,我一直在使用Google自学SQL。
我们有工程订单,可以对他们进行大量交易。我想找到最新的一个,并根据工程订单号(这是一个唯一的 ID)返回它?我尝试使用 MAX,但这只返回该记录的交易日期。
我认为我的挣扎可能是由于缺乏对SQL分组的理解造成的。在 Crystal 中,它只是"选择要分组的内容",但由于某种原因,在 SQL 中,我似乎被迫按所有选定字段进行分组。
我的最终目标是能够将工程订单的计划结束日期("我们需要在那之前完成这项工作")与根据工程订单预订最后一笔交易的时间进行比较,以便我可以创建 OTIF KPI。
我附上了我目前在SQL Server 2014 Management Studio中看到的图像,下面是我对查询的尝试。
SELECT wip.WO.WO_No
, wip.WO.WO_Type
, stock.Stock_Trans_Log.Part_No
, stock.Stock_Trans_Types.Description
, stock.Stock_Trans_Log.Qty_Change
, stock.Stock_Trans_Log.Trans_Date
, wip.WO.End_Date
, wip.WO.Qty - wip.WO.Qty_Stored AS 'Qty remaining'
, MAX(stock.Stock_Trans_Log.Trans_Date) AS 'Last Production Receipt'
FROM stock.Stock_Trans_Log
INNER JOIN production.Part
ON stock.Stock_Trans_Log.Part_No = production.Part.Part_No
INNER JOIN wip.WO
ON stock.Stock_Trans_Log.WO_No = wip.WO.WO_No
INNER JOIN stock.Stock_Trans_Types
ON stock.Stock_Trans_Log.Tran_Type = stock.Stock_Trans_Types.Type
WHERE (stock.Stock_Trans_Types.Type = 10)
AND (stock.Stock_Trans_Log.Store_Code <> 'BI')
GROUP BY wip.WO.WO_No
, wip.WO.WO_Type
, stock.Stock_Trans_Log.Part_No
, stock.Stock_Trans_Types.Description
, stock.Stock_Trans_Log.Qty_Change
, stock.Stock_Trans_Log.Trans_Date
, wip.WO.End_Date
, wip.WO.Qty - wip.WO.Qty_Stored
HAVING (stock.Stock_Trans_Log.Part_No BETWEEN N'2Z' AND N'9A')
查询 + 结果
如果我的释义是正确的,你可以使用以下内容......
WITH
sequenced_filtered_stock_trans_log AS
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY WO_No
ORDER BY Trans_Date DESC) AS reversed_sequence_id
FROM
stock.Stock_Trans_Log
WHERE
Type = 10
AND Store_Code <> 'BI'
AND Part_No BETWEEN N'2Z' AND N'9A'
)
SELECT
<stuff>
FROM
sequenced_filtered_stock_trans_log AS stock_trans_log
INNER JOIN
<your joins>
WHERE
stock_trans_log.reversed_sequence_id = 1
首先,这将应用WHERE
子句来筛选日志表。
应用WHERE
子句后,将计算序列 ID。 每个分区(每个WO_No
)从一个重新启动,并从最高Trans_Date
开始。
最后,可以在外部查询中使用带有WHERE
子句的子句,该子句指定您只需要序列 id 为 1 的记录,这是每WO_No
的最新行。 该表的其余联接将照常进行。
如果有任何其他过滤应该在应用ROW_NUMBER()
之前完成(通过连接或任何其他方式)。