2016-04-28 110 views
0

我是新來的SQL查詢,我需要做一個加入該查詢開始:SQL選擇其中的日期爲最小和最大

SELECT b.Name AS VehicleName, 
     a.* 
FROM VehicleDay AS a 
     INNER JOIN 
     Vehicles AS b 
     ON a.VehicleId = b.Id 
WHERE b.SiteId = 100 
     AND a.Day >= '2016-04-22' 
     AND a.Day < '2016-04-28'; 

,並從信息數據表中添加6列:

開始(當日第一個值)&結束 (當天最後一個) - 累積[CML] - 電流容量[帽] - 總費用[CHRG]

所以我需要在添加上最右邊 S Cml | E Cml | S Cap | E Cap | S Chrg | E Chrg

在Info表中,我得到了同一VehicleId在不同時間段的值,我需要爲日期範圍內的每一天選擇第一個和最後一個數據。

到目前爲止,我的查詢看起來是這樣的:

SELECT b.Name AS VehicleName, 
     a.*, 
     c.MaxDay, 
     c.Cumulative, 
     c.CurrentCapacity, 
     c.TotalCharge 
FROM VehicleDay AS a 
     INNER JOIN 
     Vehicles AS b 
     ON a.VehicleId = b.Id 
     INNER JOIN 
     (SELECT VehicleId, 
       MAX(TimestampLocal) AS MaxDay, 
       CAST (TimestampLocal AS DATE) AS Day, 
       Cumulative, 
       CurrentCapacity, 
       TotalCharge 
     FROM  Info 
     GROUP BY VehicleId, 
       CAST (TimestampLocal AS DATE), 
        Cumulative, CurrentCapacity, TotalCharge) AS c 
     ON a.VehicleId = c.VehicleId 
      AND a.Day = c.Day 
WHERE b.SiteId = 100 
     AND a.Day >= '2016-04-22' 
     AND a.Day < '2016-04-28'; 

但是第二個查詢返回的第一個和我需要顯示的行數作爲第一個多行。

有沒有一種方法可以將這6列添加到我的查詢中,而無需添加更多行?

+0

來自'VehicleDay'和'Vehicles'表的數據是否在其他行中重複出現? – Invictus

+0

編號車輛表僅包含Id和名稱,並且Id是VehicleDay的外鍵,包含每天加載的信息 – Dana

+0

我指的是在您提到的第二個查詢中看到的「其他行」。換句話說,是否有任何一對行的「VehicleId」和「Day」條目具有匹配的值? – Invictus

回答

1

重複的原因是,您也可以通過Cumulative, CurrentCapacity, TotalCharge進行分組,這可能在同一天有不同的值。那麼GROUP BY將每天提供多條記錄,因此將已從其他兩個表中選擇的記錄相乘。

您可以首先獲取時間戳的MIN/MAX值,然後使用這些值再次加入表Info兩次,一次檢索與MIN時間相關的列,一次對於與這些相關的列MAX時間:

SELECT  b.Name AS VehicleName, 
      a.*, 
      c.S_Time, 
      c.E_Time, 
      s.Cumulative  AS S_Cml, 
      e.Cumulative  AS E_Cml, 
      s.CurrentCapacity AS S_Cap, 
      e.CurrentCapacity AS E_Cap, 
      s.TotalCharge  AS S_Chrg, 
      e.TotalCharge  AS E_Chrg 
FROM  VehicleDay AS a 
INNER JOIN Vehicles AS b 
     ON a.VehicleId = b.Id 
LEFT JOIN (SELECT VehicleId, 
        CAST (TimestampLocal AS DATE) AS Day, 
        MIN(TimestampLocal) AS S_Time, 
        MAX(TimestampLocal) AS E_Time 
      FROM  Info 
      GROUP BY VehicleId, 
        CAST (TimestampLocal AS DATE) 
      ) AS c 
     ON a.VehicleId = c.VehicleId 
     AND a.Day = c.Day 
LEFT JOIN Info AS s 
     ON s.VehicleId = c.VehicleId 
     AND s.TimestampLocal = c.S_Time 
LEFT JOIN Info AS e 
     ON e.VehicleId = c.VehicleId 
     AND e.TimestampLocal = c.E_Time 
WHERE  b.SiteId = 100 
     AND a.Day >= '2016-04-22' 
     AND a.Day < '2016-04-28' 

有一個條件:該組合VehicleIdTimestampLocal必須是唯一的,或者你仍然會得到更多的行比預期的。

+0

太棒了!謝謝! :) – Dana

+0

不客氣。 – trincot

相關問題