2017-01-12 1 views
1

ID(pri_key)、dt(タイムスタンプ)と使用量を列として持つ「測定」という表があります。 最小使用量または最大使用量は、複数回発生する可能性があります。私は、使用の最小値と最大値が昨日発生した最初のレコードを選択したいと思います。私はこのプロジェクトで忙しかったとき、それは、少なくとも私に前日からすべてのレコードを与えるだろう昨日からレコードでMINとMAX値が発生しました

+---------------------+-----------------+ 
| dt     | usage   | 
+---------------------+-----------------+ 
| 2017-01-10 01:11:01 |    6 | 
| 2017-01-10 01:55:01 |    6 | 
| 2017-01-10 02:19:01 |    6 | 
| 2017-01-10 03:11:02 |    6 | 
| 2017-01-10 04:57:01 |    6 | 
| 2017-01-11 08:22:02 |    6 | 
| 2017-01-11 13:42:02 |    6 | 
| 2017-01-11 17:52:01 |   2609 | 
| 2017-01-11 23:06:01 |    6 | 
| 2017-01-12 03:29:02 |    6 | 
| 2017-01-12 04:17:02 |    6 | 
| 2017-01-12 05:39:01 |    6 | 
+---------------------+-----------------+ 

を昨日:

SELECT dt, usage FROM measurement as a, 
     (SELECT MIN(usage) as mini, MAX(usage) as maxi FROM measurement) as m 
WHERE m.mini = a.usage OR m.maxi = a.usage AND 
a.dt >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(a.dt) < DATE(NOW()); 

これは私に与える:私はこれまで持って

。今では、最低値と最高値のすべてのレコードを私に提供します。とにかく、私は初めての値をフィルタ処理しようとした「6」が発生して使用することにより発生した、値「2609」:

SELECT dt, usage FROM measurement as b, 
     (SELECT MIN(dt) as first, usage as us FROM measurement) as a, 
      (SELECT MIN(usage) as mini, MAX(usage) as maxi FROM measurement) as m 
where m.mini = a.us or m.maxi = a.us and 
a.first >= DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(a.first) < DATE(NOW()); 

は、しかし私に空のセットを提供します。私が探しています:

| 2017-01-11 08:22:02 |    6 | 
| 2017-01-11 17:52:01 |   2609 | 
+0

@krishnpatel昨日から早い最小使用方法については

。 –

答えて

1

これはおそらく、最も素晴らしい解決策ではありませんが、一つの選択肢は、昨日から最小/最大使用量を持つレコードを制限するサブクエリを使用することであろう最も早く取得するために発注し、LIMIT 1と組み合わせますそれぞれの場合に記録する。

SELECT a.dt, 
     a.usage 
FROM measurement a 
WHERE a.dt BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(NOW()) AND 
     a.usage = (SELECT MIN(usage) FROM measurment 
       WHERE dt BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(NOW())) 
ORDER BY a.dt 
LIMIT 1 

昨日から最古の最大使用量のために:あなたはそれを改善し、あなたの答えを削除する必要はありません

SELECT a.dt, 
     a.usage 
FROM measurement a 
WHERE a.dt BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(NOW()) AND 
     a.usage = (SELECT MAX(usage) FROM measurment 
       WHERE dt BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE(NOW())) 
ORDER BY a.dt 
LIMIT 1 
+0

私は同じ考えをしましたが、それが一度に行え、ちょうど2つの行を返すことができるかどうか疑問に思いました。そうでなければ、あなたの答えは間違いなくあります! –

+0

@Arjan_IO私があなたに与えた2つのクエリを「結合」することができます。それに助けが必要な場合は、私に知らせてください。 –

+0

いいアイデア。私はそれがうまくいくので、私は大丈夫だが、感謝している。 –

関連する問題