- ベストアンサー
SQL2005でLAG関数に似た関数はありますか?
- SQL2005にはLAG関数が存在しないため、他の方法を探している。
- テーブルを別名保存し、空行を追加してオリジナルと結合しているが、負荷がかかりディスク領域も取る。
- 代替方法があれば教えて欲しい。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 WITHはCTE(共通テーブル式)と言って、SQL2005から使えるようになりました。同じ記述が複数登場するようなケースで先頭に宣言します。 このCTEは一時テーブルではなく、tempdbに実体が作られるわけではありません。 (もちろん分析関数を使った時点で処理中にtempdbを使うのは避けられないわけですが) >1000万件ではなく7億万件という笑えない大きさです。 これは後出しじゃんけんみたいなものですね。 結局LAGはなくても、LAGと同じ機能のものお望みということですよね。 であれば、SQL Serverにはありません。 たぶん、一時テーブルを使わない方法では先に書いた方法以外はないと思います。 正直知恵を絞る場所はLAGの代わりを探すことではなくて、7億件を一気に処理させないで済む方法を考えることだと思わなくはないです。
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
>あまりに負荷がかかり、ディスク領域も取ることから 1000万件くらいあるんですかね? 分析関数の実装状況はDBMSにより違いますから、一時テーブルにインデックスを張るなど、うまく活用すれば今のやり方でも決してだめではないと思います(SQL2000でやれと言われれば分析関数がないからできないとは言えないですし、そういう方法も知っていて然るべきでしょう)。 LAGやRATIO_TO_REPORTなどは結局すべてROW_NUMBER() OVERやSUM() OVERの延長ですから、書き換えられます。 WITH data AS (SELECT ID,seq,time, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SEQ) rseq FROM table1) SELECT d1.*, d1.time-d2.time time_diff FROM data d1 LEFT OUTER JOIN data d2 ON d2.ID=d1.ID AND d2.rseq=d1.rseq-1
補足
jamshid6様、ご丁寧な解説ありがとうございます。 1000万件ではなく7億万件という笑えない大きさです。 頂いた回答を拝見させていただきましたが、 (1)以下のスクリプトはSQL2005でもいけるのでしょうか? WITHは使えないような気がいたします。私の勉強不足なら すいません。Withより前がないので、どうなってますでしょうか? WITH data AS (SELECT ID,seq,time, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY SEQ) rseq FROM table1) (2)以下のスクリプトを見ますとやはり一発でやるのは無理なのでしょうか?7億でやるのはかなり辛く、かといってSSDの1TBを買う予算も ございません。なるべくtempディスクを取らず、データ領域も取らない方法はないものでしょうか? SELECT d1.*, d1.time-d2.time time_diff FROM data d1 LEFT OUTER JOIN data d2 ON d2.ID=d1.ID AND d2.rseq=d1.rseq-1
- chukenkenkou
- ベストアンサー率43% (833/1926)
SQL Server 2005とのことなので、Oracleの分析関数( over() )と同等の機能が実装されています。 これを活用し、row_numberで自己結合すれば、比較的容易に実装できると思います。
お礼
ご解説ありがとうございます。tempdbに作られないわけですね! それだけでもありがたいです。本当にありがとうございます。