3

単純化しようとしている時系列データがあります (グラフを同じ形状に維持しながらポイントの数を減らします)。たとえば、このデータセットがある場合:

Time: 1, Value: 5
Time: 6, Value: 5
Time: 11, Value: 5.1
Time: 12, Value: 5
Time: 20, Value: 5.2
Time: 22, Value: 6
Time: 23, Value: 10

公差が 0.5 の簡略化されたバージョンは次のようになります。

Time: 1, Value: 5
Time: 20, Value: 5.2
Time: 22, Value: 6
Time: 23, Value: 10

GIS データの Douglas-Peucker アルゴリズムは知っていますが、軸の単位が異なるため、それを時系列データに適用する方法がわかりません。これをすべてデータベースで実行できたら最高です。

4

2 に答える 2

1

そのための組み込み関数については知りません。このクエリは仕事をするかもしれません:

WITH x AS (
    SELECT t, val
          ,@(lead(val) OVER w - val) AS delta1
          ,@(lag(val)  OVER w - val) AS delta2
    FROM   tbl
    WINDOW w AS (ORDER BY t)
    ORDER  BY t
    )
SELECT t, val
FROM   x
WHERE  delta1 > 0.2
   OR  delta2 > 0.2
   OR  delta1 IS NULL
   OR  delta2 IS NULL;

CTEでウィンドウ関数lead()lag()絶対値演算子@を使用して、デルタを計算します (最速である必要があります)。

デルタの少なくとも 1 つがより大きい行のみが保持され0.2ます (例に一致する任意のしきい値)。

最初と最後の行は、delta1またはdelta2NULL存在する特殊なケースです (先行/遅延行はありません)。いずれにせよこれらの行を含めたいので、 final に NULL チェックを追加しますSELECT

要求した結果を生成します。


方向がどれだけ変化するかに集中する別のバリ​​アント:

WITH x AS (
    SELECT t, val
          ,@(lead(val) OVER w + lag(val) OVER w - 2*val) AS deviate
    FROM   tbl
    WINDOW w AS (ORDER BY t)
    ORDER  BY t
    )
SELECT t, val, deviate
FROM   x
WHERE  deviate > 0.2
   OR  deviate IS NULL;

これにより、形状がより厳密に保持されます。この例では、行を保持Time: 12, Value: 5し、コメントで説明した効果を回避します。(質問の例は、この方向を指していませんでした。)

于 2012-05-25T01:23:20.777 に答える
1

Ramer Douglas Peucker がここで働くでしょう - ユニットが問題になるはずです。

于 2015-08-08T16:50:45.230 に答える