我在查询中有这个:
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
答案 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