8

次のような時系列データを含むテーブル S があります。

key   day   delta

特定のキーについて、日数が欠落する可能性はありますが、ほとんどありません。

この累積データを別のテーブルに挿入する目的で、デルタ値 (正の INT) から累積列を作成したいと思います。これは私がこれまでに得たものです:

SELECT key, day,
   SUM(delta) OVER (PARTITION BY key ORDER BY day asc RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW),
   delta
FROM S

私の SQL フレーバーでは、デフォルトのウィンドウ句は RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ですが、明示的にするためにそこに残しました。

このクエリは非常に遅く、累積カウントに 0 を入力した古い壊れたクエリよりも桁違いに遅いです。累積数を生成する他の方法に関する提案はありますか?

私はここで解決策を見ました: テーブル内のグループ化されたレコードによる累計

私が使用している RDBM は Vertica です。Vertica SQL は最初のサブセレクト ソリューションを排除し、そのクエリ プランナーは、2 番目の左外部結合ソリューションが上記の分析形式よりも約 100 倍コストがかかると予測します。

4

2 に答える 2

-1

相関サブクエリを使用する方が速い場合があります。

SELECT 
    [key]
    , [day]
    , delta
    , (SELECT SUM(delta) FROM S WHERE [key] < t1.[key]) AS DeltaSum
FROM S t1
于 2014-05-27T17:28:26.037 に答える