2015-05-22 3 views
0

Мне нужно сделать небольшую настройку здесь и не уверен, что это можно сделать. В следующем случае, если нет строки '001', тогда я хочу только 1 строку для этого порядка, но когда есть 001, я хочу этого и следующего в соответствии с самым ранним временем.нужно выбрать максимум 2 строки, но в зависимости от значения

CREATE VIEW rklib.clspaytp AS Select * from 
(
    Select x.*, 
    row_number() over (partition by otord# 
         order by case ottrnc when '001' then 1 else 2 end 
         , ottrnd, ottrt 
         ) 
        as RowN 
    from rklib.clspaytpp x 
) a 
where a.RowN in (1,2) 

У нас есть данные, как например:

+-------+-------+------+------+ 
| Order | Codes | Rep | Time | 
+=======+=======+======+======+ 
| 123 | 001 | Buck | 0900 | 
+-------+-------+------+------+ 
| 123 | CCW | BUCK | 0909 | 
+-------+-------+------+------+ 
| 123 | FGH | BUCK | 0904 | 
+-------+-------+------+------+ 

Здесь мы хотим, 001 и FGH. FGH раньше CCW на 5 м.

Теперь, если 001 не было, то все, что мы хотим это FGH, из 2. Мы хотим только 2fer, когда один из них является 001.

+0

Измените свой вопрос и покажите образец входных данных и пример конечного результата, который вы хотите. –

ответ

0

Вот один из возможных решений.

create table clspaytpp (
    otord# decimal (5, 0), 
    ottrnc char (3), 
    ottrnd char (10), 
    ottrt decimal (4, 0)); 

insert into clspaytpp values 
(123, '001', 'Buck', 0900), 
(123, 'CCW', 'BUCK', 0909), 
(123, 'FGH', 'BUCK', 0904); 

insert into clspaytpp values 
(124, 'CCW', 'BUCK', 0909), 
(124, 'FGH', 'BUCK', 0904); 

with code1 as (
    select otord# as otord1 
    from clspaytpp 
    where ottrnc = '001' 
    group by otord# 
    order by otord#) 
select * 
from clspaytpp 
where otord# in (select otord1 from code1) 
    and ottrnc = '001' 
union 
select * 
from clspaytpp o 
where ottrt in (select min(ottrt) from clspaytpp i where i.otord# = o.otord# and ottrnc <> '001') 
    and ottrnc <> '001' 
order by 1, 2;