2016-11-04 9 views
0

25k250kの間に行数を持つテーブルがあります。今私はNTILEを使用して処理するために、このテーブル全体をチャンクで分割する必要があります。固定数をNTILE(4)とすれば、それはうまく動作します。パラメータを動的に渡す方法はありますか?NTILEの動的パラメータ

個々のバッチサイズを25kに維持したいと考えています。表は40K行を持っている場合は、パラメータ値が2は、その150K場合、それはそうでと...

する必要がありますする必要がありますので、親切にこれを実現する方法を提案します。おそらく、あなたの説明から、

+1

NTILEは実際にあなたが望むものではないと思われます。既存のものは、任意の数のレコードを取り、同じサイズのチャンクの固定セットにグループ化することが全目的です。あなたの場合、25k行のサイズのチャンクの可変セットが必要です。 ROW_NUMBER()には式を使用してください。 'CEIL(ROW_NUMBER()OVER(ORDER BY id)/ 25000)' –

答えて

4

それはあなたが動的にパラメータを渡したい理由は明らかではない、と静的な表現としてそれを持っていない、EDITED

のようなもの:最初に私は、引数に直接サブクエリで数を有しましたNTILE()になりますが、これは機能しません.Oracleの実装ではサポートされていません。

これは動作するはずです - SCOTTスキーマ内のEMP表でテストは:

select empno, ename, 
     ntile (ceil(ct/4)) over (partition by ct order by empno) as n_tile 
from emp cross join (select count(*) as ct from emp); 

    EMPNO ENAME   N_TILE 
---------- ---------- ---------- 
     7369 SMITH    1 
     7499 ALLEN    1 
     7521 WARD    1 
     7566 JONES    1 
     7654 MARTIN    2 
     7698 BLAKE    2 
     7782 CLARK    2 
     7788 SCOTT    2 
     7839 KING    3 
     7844 TURNER    3 
     7876 ADAMS    3 
     7900 JAMES    4 
     7902 FORD    4 
     7934 MILLER    4 

14 rows selected 

ので、基本表の行のカウントは別々に行われる必要がある、その後である(クロス結合を使用しますテーブルの1つに行が1つしかないため)。

ので:

select ..... , ntile (ceil(ct/25000)) over (partition by ct order by .....) 
    .... 
    from <base_table> CROSS JOIN (select count(*) as ct from <base_table>) 
+0

テーブルは一定の行数を持たず、ある時点では25k行、その他の120kなどがあります。もしそれを修正すれば私は行数に基づいて番号を変更し続ける必要があります。カウントを取得するためのクエリを書くことは動作せず、定数が必要なのでエラーが返されます。 – Bhushan

+0

"ダイナミック"を正しく使うとは思わない。定数ではないものを渡しても、それは「動的」にはなりません。私のソリューションには式が含まれており、カウントを25,000で除算して切り上げます。これは「動的」ではありません。私はあなたが「定数を期待している」という意味を理解していません。これをどのように使っているかを示すことができますか? – mathguy

+0

実際には、私は問題を見る - あなたは 'NTILE()'の式引数の一部としてスカラー副問い合わせを持つことはできません。回避策を考えて... – mathguy

0

あなたはあなたのテーブルの行数のためにNTILE(x)とyについて2変数xを宣言することができます。 まず、テーブルのcount(*)としてyを代入し、if関数を使ってyをxに代入します。

+0

私はSQLで変数を宣言する方法がわかりません。私はここでPL/SQLを使用していません。 SQLのみを使用することは可能ですか?はいの場合は、同じようにサンプルSQLを親切に共有してください。 – Bhushan

+0

オラクルを使用していることをタグで推測します。 – cenzuratu

+0

宣言 y番号; begin テーブルからyにcount(*)を選択します。 end; – cenzuratu

関連する問題