2017-12-30 21 views
1

要旨を任意のn個の列を選択:は、動的ウィンドウ関数で私の本当のselect文の

select 
    lag(somecol) over (partition by thing_id) as prev_1, 
    lag(somecol,2) over (partition by thing_id) as prev_2, 
    lag(somecol,3) over (partition by thing_id) as prev_3, 
    othercol, 
    ... 

overはかなり密な、読めないコードにつながるはるかに複雑である本当のクエリで。さらに、最後の3行を取得することはハードコーディングされます(vs n =何でも)。

ストレートSQLには、これらのprev_x列を反復的にまたは再帰的に指定する方法はありますか?1)コードが読みやすく、2)前の列の数を動的に指定できますか?

答えて

1

ちょうど最初の質問に答えるために、コードを読みやすくするために、Postgresではウィンドウを定義して名前を付けてから、クエリで数回参照します。

Window Functionsのためのドキュメントを参照してください。

クエリは、複数のウィンドウ関数を伴う場合、それは別のOVER句でそれぞれを書き出す することが可能ですが、あれば、これは 重複でエラーが発生しやすいですいくつかの機能に対して同じウィンドウ操作が望まれます。 代わりに、各ウィンドウ動作はWINDOW句で と命名され、次にOVERで参照されます。たとえば:

SELECT sum(salary) OVER w, avg(salary) OVER w 
FROM empsalary 
WINDOW w AS (PARTITION BY depname ORDER BY salary DESC); 

この機能はSQL標準の一部であるかどうか私は知らないが、私は、SQL Serverがそれをサポートしていないことを知っています。

だから、あなたのクエリは次のようになります。「動的n個前のCOLSの数を指定」する方法あなたの2番目の質問については

select 
    lag(somecol) over w as prev_1, 
    lag(somecol,2) over w as prev_2, 
    lag(somecol,3) over w as prev_3, 
    othercol, 
    ... 
from 
    ... 
WINDOW w AS (partition by thing_id) 
; 

- あなたはSELECTのテキストを生成する必要がありますステートメントを動的に達成する。 RDBMSは安定したスキーマを想定している。すなわち、テーブルおよびクエリの列の数は通常動的ではなく固定されている。

+0

これは現在の読みやすさの問題を解決しました。私は動的にSELECTを生成することはできませんので、列カウントを「ハードコーディング」しています。 –

関連する問題