1

データベース内のすべての燃料タンクから現在のガロン値を計算するこのクエリがあります。

SELECT DISTINCT y.TankNumber as TankNumber
    , y.Gallons as Gallons
    , y.timeUpdated
    , y.FuelType as FuelType
FROM (
    SELECT TankNumber, max(timeUpdated) as maxdate
    FROM someTable
    GROUP BY TankNumber) as x
JOIN someTable y
ON x.TankNumber = y.TankNumber
AND x.maxdate = y.timeUpdated
ORDER BY y.TankNumber

燃料使用量に基づいて、データはいつでも自動的にデータベースにダンプされます。上記のクエリでは、各燃料タンクの現在のガロン値のみが表示されます。

TankNumber  |  Gallons  |  timeUpdated        |  FuelType
     1      |  14       |  2012-10-22 04:16   |  89
     2      |  8        |  2012-10-22 04:14   |  93


私の問題は、ページに別の出力値を追加しようとしていることです。これにより、前回の更新以降に使用された燃料の量に違いが生じます。したがって、次のようになります。

TankNumber  |  Gallons  |  timeUpdated        |  FuelType  |  GallonsUsed
     1      |  14       |  2012-10-22 04:16   |  89        |  5
     2      |  8        |  2012-10-22 04:14   |  93        |  -11

残念ながら、私のSQLの経験は、このタイプの問題に対してそれほど堅実ではなく、私は約2日間、何かに近いものを見つけたり、グーグルで検索したりしてきました。だから、どんな助けでも大歓迎です。

4

1 に答える 1

3

MS SQL 2005以降を使用している場合は、ROW_NUMBER関数を使用できます。

WITH cteOrderedUpdates As
(
   SELECT
      TankNumber,
      Gallons,
      TimeUpdated,
      FuelType,
      ROW_NUMBER() OVER 
      (
         PARTITION BY 
            TankNumber 
         ORDER BY 
            TimeUpdated DESC
      ) As RowNumber
   FROM
      someTable
)
SELECT
   x.TankNumber,
   x.Gallons,
   x.TimeUpdated,
   x.FuelType,
   x.Gallons - IsNull(y.Gallons, 0) As GallonsUsed
FROM
   cteOrderedUpdates As x
   LEFT JOIN cteOrderedUpdates As y
   ON x.TankNumber = y.TankNumber
   And x.RowNumber = y.RowNumber - 1
WHERE
   x.RowNumber = 1
ORDER BY
   x.TankNumber
;
于 2012-10-22T16:57:56.463 に答える