2016-11-04 62 views
0

我有表格,其行數在之間25k250k。現在我需要將整個表格分成幾塊,以便使用NTILE進行處理。如果我將固定計數作爲NTILE(4),它對我來說工作正常。我們有任何方法來動態傳遞參數嗎?NTILE的動態參數

我想保留個別批量大小到25k。所以,如果表中有40K行參數值應爲,如果其150K,它應該是等等...

請建議如何實現這一目標。

+1

我懷疑NTILE實際上並不是你想要的。現有的全部目的是獲取任意數量的記錄並將它們分組爲一組固定大小的塊。就你而言,你需要一組可變大小的塊,每塊大小爲25k行;因此只需使用ROW_NUMBER()的表達式,例如'CEIL(ROW_NUMBER()OVER(ORDER BY id)/ 25000)' –

回答

4

從你的描述你爲什麼要動態傳遞的參數,而不是把它作爲一個靜態的表情,或許有點像

編輯,則不太清楚:首先我直接在子查詢中的計數參數到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 

因此,需要在基表中的行數單獨做,然後用一個交叉連接(這是很好,因爲其中一個表只有一行)。

所以:

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左右..如果我會修復它到4然後它不會工作,我必須不斷改變數量根據行數。編寫查詢以獲取計數不起作用,並且因爲它需要一個常量而給出錯誤。 – Bhushan

+0

我不認爲你正確地使用「動態」。只是傳遞一些不穩定的東西並不會使它變得「動態」。我的解決方案包含一個表達式,它將計數除以25,000,並且四捨五入 - 這不是「動態」。我不明白你的意思是「因爲它期望一個常數」 - 你能證明你是如何使用它的嗎? – mathguy

+0

實際上,我發現問題 - 你不能將標量子查詢作爲NTILE()的表達式參數的一部分。思考解決方法... – mathguy

0

你可以聲明2個變量X的NTILE(X)和y行的表格數量。 首先您將y分配爲表格的count(*),然後使用if函數根據y分配x。

+0

我不知道如何在sql中聲明變量。我在這裏不使用PL/SQL。是否有可能僅使用SQL?如果是,請分享示例sql。 – Bhushan

+0

我從標籤中猜測你正在使用oracle。 – cenzuratu

+0

申報 y號; begin 從表中選擇count(*)到y; 結束; – cenzuratu