我有表格,其行數在之間25k至250k。現在我需要將整個表格分成幾塊,以便使用NTILE
進行處理。如果我將固定計數作爲NTILE(4)
,它對我來說工作正常。我們有任何方法來動態傳遞參數嗎?NTILE的動態參數
我想保留個別批量大小到25k。所以,如果表中有40K行參數值應爲,如果其150K,它應該是等等...
請建議如何實現這一目標。
我有表格,其行數在之間25k至250k。現在我需要將整個表格分成幾塊,以便使用NTILE
進行處理。如果我將固定計數作爲NTILE(4)
,它對我來說工作正常。我們有任何方法來動態傳遞參數嗎?NTILE的動態參數
我想保留個別批量大小到25k。所以,如果表中有40K行參數值應爲,如果其150K,它應該是等等...
請建議如何實現這一目標。
從你的描述你爲什麼要動態傳遞的參數,而不是把它作爲一個靜態的表情,或許有點像
編輯,則不太清楚:首先我直接在子查詢中的計數參數到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>)
表不會有恆定數量的行,在一個時間點上它可以有25k行,在其他120k左右..如果我會修復它到4然後它不會工作,我必須不斷改變數量根據行數。編寫查詢以獲取計數不起作用,並且因爲它需要一個常量而給出錯誤。 – Bhushan
我不認爲你正確地使用「動態」。只是傳遞一些不穩定的東西並不會使它變得「動態」。我的解決方案包含一個表達式,它將計數除以25,000,並且四捨五入 - 這不是「動態」。我不明白你的意思是「因爲它期望一個常數」 - 你能證明你是如何使用它的嗎? – mathguy
實際上,我發現問題 - 你不能將標量子查詢作爲NTILE()的表達式參數的一部分。思考解決方法... – mathguy
我懷疑NTILE實際上並不是你想要的。現有的全部目的是獲取任意數量的記錄並將它們分組爲一組固定大小的塊。就你而言,你需要一組可變大小的塊,每塊大小爲25k行;因此只需使用ROW_NUMBER()的表達式,例如'CEIL(ROW_NUMBER()OVER(ORDER BY id)/ 25000)' –