0

さまざまなメーターの測定値を保持するテーブルがあります

+-----------+---------+---------+---------+---------------------+
| idReading | idMeter |  index  |  usage  | dateOfReading       |
+-----------+---------+---------+---------+---------------------+
|       671 |     189 | 884.000 | 441.000 | 2012-06-01 00:00:00 |
|       672 |     190 | 170.000 |  82.000 | 2012-06-01 00:00:00 |
|       584 |     190 |  88.000 |  88.000 | 2012-05-01 00:00:00 |
|       583 |     189 | 443.000 | 443.000 | 2012-05-01 00:00:00 |
+-----------+---------+---------+---------+---------------------+

私のアプリケーションでは、現在の読み値 (存在する場合と存在しない場合があります) と、数か月前の可能性のある以前の読み値の両方を利用できるようにする必要があります。したがって、現在のリーディングは 7 月かもしれませんが、前回のリーディングは 4 月になる可能性があります。

次のクエリを使用して、以前の読み取り値を取得しています。

SELECT * FROM (
  SELECT Reading.idMeter, Reading.usage, Reading.`Index`, Reading.dateOfReading
  FROM meterReadings AS Reading
  WHERE Reading.idMeter IN (189,190)
    AND Reading.dateOfReading < '2012-07-31'  
  ORDER BY Reading.dateOfReading DESC) AS OrderendReading
GROUP BY OrderendReading.idMeter

これはうまく機能しますが、別の SELECT 内で SELECT を使用していることに満足していません。テーブルが大きくなるにつれて、リクエストに時間がかかるようになるのではないかと心配しています。以前の読みを取得する他の方法はありますか? または、このクエリをより効率的にする方法はありますか?

または、理想的には、同じクエリで現在の読み取り値と前の読み取り値の両方を取得しますか?

ありがとうございました。

4

3 に答える 3

1

相関サブクエリは、あなたが求めているものを達成すると思います:

SELECT  Reading.idMeter, 
        Reading.usage, 
        Reading.`Index`, 
        Reading.dateOfReading,
        (   SELECT  mr.Usage
            FROM    MeterReadings AS mr
            WHERE   mr.idMeter = Reading.idMeter
            AND     mr.DateOfReading < Reading.DateofReading
            ORDER BY DateOfReading DESC
            LIMIT 1
        ) AS PreviousReadingUsage
FROM    meterReadings AS Reading,
WHERE   Reading.idMeter IN (189,190)
AND     Reading.dateOfReading < '2012-07-31'  
ORDER BY Reading.dateOfReading DESC
于 2012-06-17T20:14:51.003 に答える
0

これを試して:

SELECT 
  Reading.idMeter, 
  Reading.usage, 
  Reading.`Index`,
  (Select dateOfReading from meterReading order by dateOfReading desc limit 1,1)  
FROM meterReadings AS Reading   
GROUP BY Reading.idMeter;
于 2012-06-17T19:08:20.653 に答える
0

昨日「分析関数」を発見したばかりで、このタイプの要件をカバーしていると確信しています。Youtube にもいくつかのチュートリアルがあります。

于 2012-06-17T18:52:27.487 に答える