前提・実現したいこと
PostgreSQLで、データを数行おきに間引いて取得したいです。
連番のインデックスがあるケース
以下のような方法を一番に考えたのですが、他に方法はありますでしょうか。
Postgres
1select 2 idx, 3 val 4from 5 test_table 6where 7 idx % 10 = 0
インデックスが時刻データのケース
元々やりたいことは、インデックスが連番ではなく、時系列データの場合であり、10秒おきにデータを抽出したいと考えてます。
この場合だと、以下のように時系列データから秒数部分を抜き出して、MODを計算してWHEREで抽出するんでしょうか…?
Postgres
1select 2 idx_date, 3 val 4from 5 test_table 6where 7 cast(DATE_part('seconds',idx_date) as integer)%10=0
時刻データが一定間隔ではないケース
上のケースでは、時刻データが一定間隔ごとに存在しているケースを想定しています。
しかし、実際に扱いたいデータは歯抜けがあり、2秒間隔とか3秒間隔のデータも含まれています。
そのため、上のコードの場合だと、データがごっそり抜け落ちてしまう可能性があります。
(秒数が11,13,15,17,19,21,22,24,26,28,31,...のように微妙にずれていると、データは0件…)
なので、一定間隔でなくてもとりあえず構わないので、10行ごとにデータを抽出したい場合も考えています。
この場合、一度連番を振ってから、連番のindex行を上のように抽出するか…?と考えてます。
が、これもあまり良いコードに思えません…。
Postgres
1select * from 2 (select 3 raw_number() over () as index 4 date, 5 values 6 from 7 test_table 8 ) t 9where 10 index % 10 = 0
ご教示いただきたくお願いいたします。
※そもそものやりたいことは、pythonのpandasでいうところの、df.resample(rule='10s').mean()
という作業です。
本件での作業の前に、移動平均をとる作業をした上で、本件のようにデータを間引くことを考えています。
pandasならたった1行で書ける作業ではあるのですが、ことSQLで書くとなるとどうすればいいのでしょうか…。
何卒よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー