2014-10-17 2 views
2

У меня есть это в запросе:Partition игнорируя некоторые столбцы

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 как исключить', или не хотите генерировать row_number или что-то еще? – Andrew

+0

Не могли бы вы выбрать из подзапроса 'where MY_COL3 NOT LIKE 'exclude''? Если нет, то почему? – 9000

ответ

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; 

Результаты не совпадают. Пример использует 1 дважды для нового номера строки - это ошибка?

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 
Смежные вопросы