2015-05-18 63 views
0

這是一個擴展到以前quesiton,Order by depending on 2 col values.我有一個查詢返回如下輸出,排序在特定行的查詢結果中的排名

SELECT DISTINCT a.rev_date ,fruitname, 
fruit_id , primary_fruit_id 
FROM fruits a, fruit_lookup s,fruit_reference r 
WHERE a.id = s.id(+) 
and primary_fruit_id = r.fruit_id(+) 
AND (fruit_id = 24 or fruit_id = 0) 
ORDER BY case when fruit_id = primary_fruit_id then 0 else 1 end, 
     fruit_id desc, 
     a.rev_date desc 

如何處理這使得我得到所需的輸出以下面的方式。所以,在fruit_id爲0的地方,那些行需要在10行結果集中的第2行和第5行。如果總計結果大約爲50,每個頁面將有10個結果,在第2和第5個位置,我需要得到如下輸出。希望這是有道理的。任何想法都表示讚賞。 thx

NAME  FRUIT_ID PRIMARY_FRUIT_ID 
-------------------------------------- 
apple  24   24 
apple  24   24 
apple  24   24 
apple  24   24 
orange  24   12 
pear  24   7 
kiwi  24   6 
melon  24   2 
grape  0   90 
banana  0   45 
carrot  0   30  
Desired output 
NAME FRUIT_ID PRIMARY_FRUIT_ID 
-------------------------------------- 
apple  24   24 
grape  0   90 
apple  24   24 
apple  24   24 
banana  0   45 
apple  24   24 
kiwi  24   6  
orange  24   12 
melon  24   2  
pear  24   7 
carrot  0   30 

回答

0

這是比以前更復雜的問題,所以答案也有些複雜。 這是什麼東西我能夠做到:

with t as (
    select x.*, 
     row_number() over (
     partition by fid order by decode(fid , pfid, 1, 2), rd desc) rbr 
    from (
     select distinct a.rev_date rd, s.fruitname fn, 
      a.fruit_id fid, primary_fruit_id pfid 
     from fruits a left join fruit_lookup s on a.id = s.id 
      left join fruit_reference r 
      on primary_fruit_id = r.fruit_id and r.fruit_id in (0, 24)) x), 
ca as (select count(1) cnt from t), 
cx as (
    select row_number() over (partition by cwm order by lvl) rn, cwm, lvl 
    from (
     select level lvl, case when mod(level, 10) in (2, 5) then 0 else 24 end cwm 
     from ca connect by level <= cnt*5)) 
select rd, fn, fid, pfid 
    from t join cx on cx.rn = t.rbr and cx.cwm = t.fid 
    order by lvl 

你沒有提供的數據結構和樣本行,所以我試圖複製他們得到原始輸入,這裏是SQLFiddle數據和查詢。

子查詢cx根據您的規則生成數字,然後將這些數字分配給您的原始查詢 並使用這些數字最終選擇排序數據。 一般邏輯是:插入fruit_id = 0的行編號爲2,5,12,15,22 ...在其他行之間。