2014-10-17 87 views
2

我有这样的查询:分区忽略一些列

ROW_NUMBER() OVER (PARTITION BY (NUMB) ORDER BY MY_COL2) AS row_number

这将非常依赖于NUMB变量同样设定值。 我实际上需要跳过某些列的分配,其中MY_COL3 LIKE 'exclude'

是否有一种简单的方法可以将它合并到上面的逻辑中?

因为如果没有,我要创建两个单独的查询和一个查询中使用上面的分配,并做好相互之间并无任何分配(以排除),然后联合两个查询。问题是,这是非常耗费时间和大量的查询和我想避免它......寻找,如果有一个速战速决...

更多细节:

这个现在是什么查询会(简化的)的基础上NUMB = 4: ROW NUMBER | USER | TEXT | STATUS | 1 | Bill | blah1 | GOOD 1 | Bill | blah2 | Exclude 2 | Jack | blah3 | GOOD 2 | Jack | blah4 | Exclude 3 | Will | blah5 | GOOD 3 | Will | blah6 | Exclude 4 | Andy | blah7 | GOOD 4 | Andy | blah8 | GOOD 这是我想: ROW NUMBER | USER | TEXT | STATUS | 1 | Bill | blah1 | GOOD | Bill | blah2 | Exclude 1 | Jack | blah3 | GOOD | Jack | blah4 | Exclude 2 | Will | blah5 | GOOD | Will | blah6 | Exclude 3 | Andy | blah7 | GOOD 4 | Andy | blah8 | GOOD

+2

你的问题不明确。你不是要分区的时候'MY_COL3像exclude',或不希望生成ROW_NUMBER,还是其他什么东西? – Andrew 2014-10-17 17:03:58

+0

你能不能从一个子查询'那里MY_COL3 NOT LIKE“exclude''选择?如果不是,为什么? – 9000 2014-10-17 17:23:22

回答

0

行可以通过使用两个case语句被排除的行号。第一个创建两个单独的partition by,一个用于排除的行,另一个用于您关心的行的一个 。外case然后显示空值被排除的行。

select 
    case 
     when status = 'Exclude' then 
      null 
     else 
      row_number() over 
      (
       partition by case when status = 'Exclude' then 0 else 1 end 
       order by numb 
      ) 
    end new_rownumber, 
    data.* 
from 
(
    select 1 numb, 'Bill' name, 'blah1' text, 'GOOD' status from dual union all 
    select 1 numb, 'Bill' name, 'blah2' text, 'Exclude' status from dual union all 
    select 2 numb, 'Jack' name, 'blah3' text, 'GOOD' status from dual union all 
    select 2 numb, 'Jack' name, 'blah4' text, 'Exclude' status from dual union all 
    select 3 numb, 'Will' name, 'blah5' text, 'GOOD' status from dual union all 
    select 3 numb, 'Will' name, 'blah6' text, 'Exclude' status from dual union all 
    select 4 numb, 'Andy' name, 'blah7' text, 'GOOD' status from dual union all 
    select 4 numb, 'Andy' name, 'blah8' text, 'GOOD' status from dual 
) data 
order by numb, status desc; 

结果并不完全匹配。该示例对新行号使用两次 - 是一个错误?

NEW_ROWNUMBER NUMB NAME TEST STATUS 
------------- ---- ---- ---- ------ 
1    1  Bill blah1 GOOD 
       1  Bill blah2 Exclude 
2    2  Jack blah3 GOOD 
       2  Jack blah4 Exclude 
3    3  Will blah5 GOOD 
       3  Will blah6 Exclude 
5    4  Andy blah7 GOOD 
4    4  Andy blah8 GOOD