2017-04-20 4 views
0

私は以下のようなテーブルをイメージに持っています。表4の列各センサーおよびイベントタイプ(sensor_id、event_type)の最新の値を返すSQLクエリ

sensor_id, event_type, value, time 

enter image description here

を有している問題は、(画像に上述したように)である:

は、各センサおよびイベントタイプ(sensor_id、EVENT_TYPE)のためにそのSQLクエリを書きます(時間的に)最新の値を返します。 テーブルは、sensor_id(昇順)、event_type(昇順)で並べ替える必要があります。

私は、次の表を返す必要がありますクエリを記述する必要があります。

enter image description here

私はO/Pを受けるために、このクエリを使用していますし、それが正しいかどうかを疑問に思いますか?

SELECT sensor_id, event_type, value FROM events ORDER BY time DESC; 
+0

これは私に面接の質問のように見えます。あなたはそのような質問の答えを求める場所ではありません。 –

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code-on-so-when-asking-a-question/285557と承認された回答 –

+0

どのDBMSを使用していますか? Postgres?オラクル? DB2?ファイアバード? –

答えて

0

正しいクエリは次のとおりです。 -

SELECT distinct sensor_id, event_type, value 
FROM events a 
inner join 
(
Select sensor_id, event_type, max(time) as recent_time 
from 
events 
group by sensor_id, event_type 
) b 
on a.time=b.recent_time and a.sensor_id=b.sensor_id and a.event_type=b.event_type 
ORDER BY sensor_id, event_type; 

それはこれが最初だけSQLでタグ付け、その答えは、標準SQLを使用した:-)

+0

sensor_idとevent_typeタイプを組み合わせると、クエリの最初のインスタンスのすべての値が最新のものから始まります。しかし、あなたが実際に望むのは、すべてのインスタンスではなく、sensor_idとevent_typeの組み合わせの最初のインスタンスに対応する値です。同様に、sensor_idとevent_typeの他のすべての組み合わせについても同様です。あなたの答えは、時間に応じて最新のインスタンスから始まるすべてのインスタンスを持ちます。それが間違った理由です –

2

お役に立てば幸いです。しかし、MySQLはmodern SQLをサポートしていないので、OPはそれを使用できません。


これは、簡単にウィンドウ関数を使用して行うことができます。

SELECT sensor_id, event_type, value 
FROM (
    select sensor_id, event_type, value , 
     row_number() over (partition by sensor_id, event_type order by time desc) as rn 
    from events 
) t 
where rn = 1 
order by sensor_id, event_type; 
+0

なぜこのクエリを使用できませんか? 'SELECT sensor_id、event_type、value FROM events ORDER BY time DESC;'これを使って、私はo/pを得ることができますが、それが正しいかどうかはわかりません。 –