【问题标题】:Order by query results in specific row positions按特定行位置的查询结果排序
【发布时间】:2015-05-19 22:21:42
【问题描述】:

这是对上一个问题的扩展,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,这些行都需要位于结果集中的第 2 行和第 5 行,例如 10 行。如果总计结果在 50 左右,则每页将有 10 个结果,在第 2 和第 5 位置我需要得到如下输出。希望这是有道理的。任何想法表示赞赏。谢谢

 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  

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    这个问题比你之前的问题复杂得多,所以答案也有些复杂。 这是我设法做的事情:

    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...的行。

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 2016-04-21
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多