2012-05-08 43 views
2

我对整体SQL有点新,并且设法绊倒了这条路,但现在我有点卡住了。SQL如何从加入结果中选择最大日期

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

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

我需要的是每个不同的油类型为cetain船和最新的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。这应该是相对容易的,但我将其列入以防对答案有任何影响。

谢谢你。

戴夫

+0

石油类型生活在哪个表? –

+0

技术上这个类型存在于OilID与Index和ROB表相关的另一个表中。但是这并不重要......我可以稍后再说。 –

回答

0

感谢nawful

我张贴自己的答案,因为它是一个轻微的修改什么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 
         ); 

主要的改变是,我需要从[石油ROB]表中的OilID匹配ROB.OilID不Oils.OilID。此外,我将WHERE移至最外层的SELECT。

如果没有你,你不可能完成它:)

+0

是的,这是正确的做法:我没有测试或在写这个答案的时候考虑过那个部分 – nawfal

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; 
+0

谢谢我从来没有想过这样做......虽然它不能从WHERE内部获取Oils.ShipID或OilIR或ROB.ShipID或OilID。 –

+0

如果我在外面移动WHERE,我只能得到最新日期的记录,而不是每个记录的最新日期。我会[更多:) :) –

+0

明白了!非常感谢很多人一个新的方法总是有帮助... –

相关问题