通过忽略某些列进行分区

时间:2014-10-17 17:01:32

标签: sql oracle partitioning

我在查询中有这个:

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

这几乎可以根据NUMB变量分配值。 实际上,我需要跳过MY_COL3 LIKE 'exclude'

的某些列的分配

是否有一种简单的方法可以将上述逻辑纳入其中?

因为如果没有,我必须创建两个单独的查询并在一个查询中使用上面的赋值,并且不在另一个查询中指定任何内容(使用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

1 个答案:

答案 0 :(得分:0)

可以使用两个case语句从行号中排除行数。第一个创建两个单独的partition by,一个用于排除的行和一个  对于你关心的行。外部case然后为排除的行显示null。

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