2011-08-11 11 views
1
を使用して、SQLサーバーで実行中の合計を計算する

私はこのようになりますいくつかのデータがあります。はすぐにセットベースの操作

+---+--------+-------------+---------------+--------------+ 
| | A |  B  |  C  |  D  | 
+---+--------+-------------+---------------+--------------+ 
| 1 | row_id | disposal_id | excess_weight | total_weight | 
| 2 | 1  | 1   | 0    | 30   | 
| 3 | 2  | 1   | 10   | 30   | 
| 4 | 3  | 1   | 0    | 30   | 
| 5 | 4  | 2   | 5    | 50   | 
| 6 | 5  | 2   | 0    | 50   | 
| 7 | 6  | 2   | 15   | 50   | 
| 8 | 7  | 2   | 5    | 50   | 
| 9 | 8  | 2   | 5    | 50   | 
+---+--------+-------------+---------------+--------------+ 

そして、私はこのように見えるためにそれを変換しています:基本的に

+---+--------+-------------+---------------+--------------+ 
| | A |  B  |  C  |  D  | 
+---+--------+-------------+---------------+--------------+ 
| 1 | row_id | disposal_id | excess_weight | total_weight | 
| 2 | 1  | 1   | 0    | 30   | 
| 3 | 2  | 1   | 10   | 30   | 
| 4 | 3  | 1   | 0    | 20   | 
| 5 | 4  | 2   | 5    | 50   | 
| 6 | 5  | 2   | 0    | 45   | 
| 7 | 6  | 2   | 15   | 45   | 
| 8 | 7  | 2   | 5    | 30   | 
| 9 | 8  | 2   | 5    | 25   | 
+---+--------+-------------+---------------+--------------+ 

を、I同じdisposal_idに属するテーブルの前の行からexcess_weightsの合計を差し引いてtotal_weight列を更新する必要があります。

私は現在カーソルを使用しています。これは、私が試した他の解決法(cte、三角結合、クロス適用)のためです。私のカーソルソリューションは、新しいdisposal_idごとにゼロにリセットされ、余分なウェイトでインクリメントし、必要に応じて更新を実行し、約40秒で実行される実行中の合計を保持します。私が試した他の解決策は3〜5分かかりました。セットベースの操作を使用してこれを行うには比較的パフォーマンスの良い方法があるのでしょうか?

+0

私は最近これについてブログしました:http://www.sqlperformance.com/2012/07/t-sql-queries/running-totals –

答えて

2

私はこのようなクエリを最適化するのに多くの時間を費やしましたが、2つのパフォーマンスオプションがありました:Denormalizing to enforce business rules: Running Totalsに記載されているように事前計算された実行合計を保存するか、クライアントで計算します。

1

あなたはおそらくすでに試した他のソリューションは、答えのような何かを行うことですが、あなたが累積和のためのまともな凝集体を持つOracleを使用しているのでなければ、あなたはカーソルを使用して方がいいでしょうhere

を見つけました。せいぜい、テーブル自体に再結合するか、O(n)操作でなければならないものについて別の方法を使用する必要があります。一般的に、これらのような問題の解決策は、乱雑であるか、または本当に乱雑です。

0

'previous rows'は注文を意味します。だからいいえ、そこにベースの操作はありません。

OracleのLEADとLAGはこのために構築されていますが、SQL Serverでは三角形の結合になっています...あなたが調査したと思います。

関連する問題