2

总的来说,我对 SQL 有点陌生,我设法通过了这么远的方式,但现在我有点卡住了。

我有两张表,一张是“船舶”到“石油类型”的索引,只是 Id 的。另一个表“ROB”是船上剩余的油量。

每个月我可能会或可能不会在 ROB 表中获得新记录。

我需要的是每艘船的每种不同的油类型,以及最新的 ROB(如果有的话)。

下面的查询让我几乎得到了我想要的,除了我得到了每种油类型的所有 ROB 并且我只想要最新的。

PARAMETERS QueryShipID Short;
SELECT Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived, ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent
FROM 
    (SELECT DISTINCT OilID, ShipID 
    FROM [Index] 
    WHERE (((ShipID)=[QueryShipID])))  
    AS Oils 

    LEFT JOIN 

    (SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived, TotalUsed, CurrentROB, DateSent 
    FROM [Oil ROB])  
    AS ROB 

    ON (Oils.ShipID = ROB.ShipID) AND (Oils.OilID = ROB.OilID);

我需要做的是获取每种油类型的最后一个 DateSent。

我发现了一些关于使用 Max 函数的教程,这些教程似乎建议将聚合查询的结果连接回原始表。但是我似乎无法让它工作,它会产生一个巨大而混乱的查询。

如果有人对最好的方法有一些建议,我将不胜感激。

理想情况下,在这样做之后,我想为日期添加一个参数,这样您就可以获得某个日期之前的最后一个 ROB。这应该相对容易,但我将其包括在内,以防它对答案有任何影响。

谢谢。

戴夫

4

3 回答 3

0

我想我最近问了几乎完全相同的问题尝试这个 SQL 选择具有不同名称列的最新记录

于 2012-05-08T17:01:00.630 回答
0
SELECT    Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived, 
          ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent
FROM 
          (
           SELECT DISTINCT OilID, ShipID 
           FROM   [Index] 
           WHERE  ShipID = [QueryShipID]
          ) AS Oils 

LEFT JOIN  

          (
           SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived, 
                  TotalUsed, CurrentROB, DateSent 
           FROM   [Oil ROB] 
           WHERE  DateSent = (
                              SELECT MAX(DateSent) 
                              FROM   [Oil ROB] 
                              WHERE  Oils.ShipID = ROB.ShipID AND 
                                     Oils.OilID = ROB.OilID
                             )
          )  AS ROB ON Oils.ShipID = ROB.ShipID AND Oils.OilID = ROB.OilID;
于 2012-05-08T17:18:02.767 回答
0

谢谢讨厌

我自己发布了答案,因为它是对 nawful 发布的内容的轻微修改。此外,K'leg 发布的链接也很有帮助,非常感谢。

这正是我想要的……

SELECT    Oils.OilID, Oils.ShipID, ROB.LastROB, ROB.Received, ROB.DateReceived,  
          ROB.PortReceived, ROB.TotalUsed, ROB.CurrentROB, ROB.DateSent 
FROM  
          ( 
           SELECT DISTINCT OilID, ShipID  
           FROM   [Index]  
           WHERE  ShipID = [QueryShipID] 
          ) AS Oils             
LEFT JOIN   
          ( 
           SELECT ShipID, OilId, LastROB, Received, DateReceived, PortReceived,  
                  TotalUsed, CurrentROB, DateSent  
           FROM   [Oil ROB]  
          )  AS ROB ON Oils.ShipID = ROB.ShipID AND Oils.OilID = ROB.OilID
WHERE     ROB.DateSent = ( 
                          SELECT MAX(DateSent)  
                          FROM   [Oil ROB]  
                          WHERE  ShipID = ROB.ShipID AND  
                                 OilID = ROB.OilID
                         );

主要修改是我需要 [Oil ROB] 表中的 OilID 来匹配 ROB.OilID 而不是 Oils.OilID。此外,我将 WHERE 移至最外层的 SELECT。

没有你是做不到的:)

于 2012-05-09T08:12:37.377 回答