2

ここに私のデータ構造があります:

name          value          date_received
foo           100            2013-09-19 10:00:00
bar           200            2013-09-19 10:00:00
foo           100            2013-09-19 10:05:00  //no change
bar           200            2013-09-19 10:05:00  //no change
foo           110            2013-09-19 10:08:00  // foo changed          
bar           200            2013-09-19 10:08:00  // no change
......

質問:
次のようなクエリ (mysql) が必要です。

select date_received where anyOf(foo, bar) changed from the previous 
specified value in the past N hours. 

テーブルには他の名前があるかもしれませんが、foo と bar だけに関心があります。

任意のポインター。私には、自己結合が必要なように見えますが、方法がわかりません。

編集:以下のクエリはちょうど良い出発点のようです。

select date_received from (SELECT DISTINCT name, value from data) a 
  INNER JOIN (select DISTINCT name, value, date_received from data)b 
    on (a.name=b.name and a.value=b.value)

更新以下のクエリが機能するように見えます-思ったより簡単です。

SELECT DISTINCT a.tr FROM (
   SELECT name, value, MAX(date_received) dr from data 
    where date_received > now() - INTERVAL 2 hour 
    GROUP BY name, value order by dr desc)a;
4

1 に答える 1

1

編集したクエリがどのように問題を解決するのかわかりません。たとえば、「最後の N 時間」はどこから来るのでしょうか。

以前の値を調べてから、日時の制約と値の変更に関するロジックを使用して、変更があったかどうかを確認することで、これに取り組みます。あなたの質問はあいまいです: 過去 N 時間の変化だけを探していますか? N 時間前の最後の値からの変化を探していますか? 値が元に戻るとどうなりますか?

ただし、これらはすべて、各行に以前の値と以前の時間を含めることで答えることができます。これを取得する方法の例を次に示します。

select t.*,
       (select t.date_received
        from t t2
        where t2.date_received < t.date_received and
              t2.name = t.name
        order by t2.date_received desc
        limit 1
       ) as prev_date_received,
       (select t.value
        from t t2
        where t2.date_received < t.date_received and
              t2.name = t.name
        order by t2.date_received desc
        limit 1
       ) as prev_value
from t
having <your logic goes here for the date time and changes you care about>;

これはhaving、便宜上、サブクエリの代わりに句を使用しています (これは他のデータベースではサポートされていません)。

たとえば、過去 N 時間の変更が必要な場合:

having date_received > now() - interval N hour and prev_value <> value
于 2013-09-20T11:59:15.020 に答える