2014-09-22 25 views
1

最大值分割行我有一個選擇結果是這樣的:的Oracle SQL根據

ID | Amount  
--------------- 
xx1 | 105 
xx2 | 70 

我想的行分成多行如果用量大於50導致:

ID | Amount 
--------------- 
xx1 | 50 
xx1 | 50 
xx1 | 5 
xx2 | 50 
xx2 | 20 

回答

3

遞歸解決方案:

WITH t(id, amount) AS 
    (SELECT id, amount 
    FROM mytable 
    UNION ALL 
    SELECT id, amount - 50 
    FROM t 
    WHERE amount - 50 > 0) 
SELECT id 
     ,least(amount, 50) amount 
FROM t 
ORDER BY id 
     ,least(amount, 50) DESC 

繼弗蘭克·施密特的評論。甲MODEL溶液應在Oracle 10g中工作:

SELECT id 
    , least(amt, 50) amount 
FROM 
    (SELECT id 
     , amt 
    FROM mytable t 
    MODEL 
    PARTITION BY (id) 
    DIMENSION BY (0 d) 
    MEASURES (amount amt) 
    RULES ITERATE (1024) UNTIL (amt[ITERATION_NUMBER] < 50) 
     (amt[ITERATION_NUMBER+1] = amt[ITERATION_NUMBER] - 50)) 
WHERE amt > 0 
ORDER BY id 
     , amt DESC 

應確保1024 * 50> = MAX(量),或更改的最大迭代數目適當地執行。

+1

+1不錯。可能值得注意的是,遞歸CTE在Oracle的舊版本中不起作用,但(AFAIK,它們是在11gR2中添加的)。 – 2014-09-22 10:35:43