2017-12-12 16 views
0

私はsensordataを格納するバックエンドとしてpostgresを使用しています。さまざまなセンサーが異なる周波数でロギングしています。私はそれぞれ別個の価値の最後を得たいと思う。私。私は次の表を持っています:テーブル内の複数のシリーズのそれぞれの最後の行を取得する

id | sensorid | type | value |   datetime    
--------+----------+------+------------+------------------------------- 
302888 |  9 | 118 |  4829 | 2017-12-12 22:20:04.911429+01 
302887 |  9 | 116 |  17000 | 2017-12-12 22:20:04.90125+01 
302886 |  9 | 104 |  40400 | 2017-12-12 22:20:04.827895+01 
302885 |  5 | 116 | 4294958596 | 2017-12-12 22:19:04.813092+01 
302884 |  5 | 104 |  76100 | 2017-12-12 22:19:04.803245+01 
302883 |  5 | 118 |  3976 | 2017-12-12 22:19:04.753291+01 
302882 |  5 | 116 | 4294958596 | 2017-12-12 22:16:18.730765+01 
302881 |  5 | 104 |  76100 | 2017-12-12 22:16:18.720933+01 
302880 |  5 | 118 |  3976 | 2017-12-12 22:16:18.700545+01 
302879 |  1 | 118 |  5410 | 2017-12-12 22:15:54.688361+01 
302878 |  1 | 116 |  19000 | 2017-12-12 22:15:54.67866+01 
302877 |  1 | 104 |  33700 | 2017-12-12 22:15:54.660863+01 
302876 |  9 | 118 |  4892 | 2017-12-12 22:15:04.646695+01 

などです。

私は、次のデータを取得したい:

id | sensorid | type | value |   datetime    
--------+----------+------+------------+------------------------------- 
302888 |  9 | 118 |  4829 | 2017-12-12 22:20:04.911429+01 
302887 |  9 | 116 |  17000 | 2017-12-12 22:20:04.90125+01 
302886 |  9 | 104 |  40400 | 2017-12-12 22:20:04.827895+01 
302885 |  5 | 116 | 4294958596 | 2017-12-12 22:19:04.813092+01 
302884 |  5 | 104 |  76100 | 2017-12-12 22:19:04.803245+01 
302883 |  5 | 118 |  3976 | 2017-12-12 22:19:04.753291+01 
302879 |  1 | 118 |  5410 | 2017-12-12 22:15:54.688361+01 
302878 |  1 | 116 |  19000 | 2017-12-12 22:15:54.67866+01 
302877 |  1 | 104 |  33700 | 2017-12-12 22:15:54.660863+01 

だから私は、各sensoridと種類の組み合わせのための最高のIDや日時を持つ行をしたいです。これは1つのSQL文で実行可能ですか?これは、仕事をする必要があります

答えて

1

SELECT 
A.ID, A.SENSORID, A.TYPE, A.VALUE, A.DATETIME 
FROM 
(
    SELECT 
    ID, SENSORID, TYPE, VALUE, DATETIME, ROW_NUMBER() OVER (PARTITION BY SENSORID, TYPE ORDER BY ID DESC) AS RNUM 
    FROM 
    YOUR_TABLE 
) A 
WHERE A.RNUM = 1; 

EDIT FYI私はIDで順序を使用していました。あなたの質問に基づいて、それは最も高いと思われるIDは、最新のことを意味します。それで意味があるはずです。ロギングが時系列的に発生し、最新のレコードを取得しようとしている場合は、DATETIMEによって行うこともできます。

+0

も ​​'パーティションby''で[値]が含まれます。 –

+0

私はそれが必要とは思わない。しかし、2つのレコードが同じ 'SENSORID'と' TYPE'で同時に記録されている場合は、 'DENSE_RANK'が良い方法でしょうか? – Vashi

+0

良い点Vashiですが、私のアプリケーションでは決して起こることはありません。 (各sensoridは異なるatmegaボードを指し、タイプはそのボードがとった測定タイプを指します、ボードは特定の周波数で目を覚ましてそれを送信します) – MortenSickel

2

私は、この目的のためにdistinct onが好き:

select distinct on (sensorid, value) sd.* 
from sensordata sd 
order by sensorid, value, datetime desc; 
関連する問題