Tengo los datos a continuación.

create table #results (
    id int
    , result_attr char(1)
    , result varchar(100)
)

insert into 
    #results (id, result_attr, result)
values 
    (1, 'E', '***ERROR')
    , (2, 'E', '***CORRECTED')
    , (3, 'E', '***RESULTED')
    , (4, 'E', '***AMENDED')
    , (4, 'E', 'FOO')
    , (5, 'E', 'ERROR***')
    , (5, 'E', 'CORPOREAL')
    , (6, 'E', '***CORRECTED')
    , (7, 'E', '***RESULTED')
    , (7, 'E', 'ABUNDANT')
    , (7, 'E', 'PLENTITUDE')
    , (8, 'E', 'INCORRECT')
    , (9, 'A', 'HIGH')
    , (10, 'A', 'LOW')

select *
from #results

drop table #results

El conjunto de resultados completo es:

complete result set

Mi conjunto de resultados deseado es:

desired result set

Esto no funciona del todo:

select
    res.id
    , res.result_attr
    , res.result
from #results as res
where
    (charindex('***', res.result) > 0 or res.result_attr = 'E')

La parte complicada es que me gustaría excluir el ID # 4 con el resultado "FOO", así como el ID # 5 con el resultado "CORPOREAL" y el ID # 7 con los resultados "ABUNDANT" y "PLENTITUDE", pero quiero mantener el ID # 8 con resultado "INCORRECTO". Con todo, quiero excluir lo siguiente:

excluded result set

Probé algunas funciones de ventanas y otras cosas, pero estoy un poco atascado en esta. ¡Agradecería cualquier ayuda!

0
Jared 8 dic. 2020 a las 18:26

2 respuestas

La mejor respuesta

Puede utilizar la función analítica row_number con orden condicional de la siguiente manera:

Select * from
(select
    res.id
    , res.result_attr
    , res.result
    , row_number() over (partition by res.id 
                         order by case when charindex('***', res.result) > 0 
                                  then 1 else 2 end) as rn
from #results as res
where
    (charindex('***', res.result) > 0 or res.result_attr = 'E') t
Where rn = 1
Order by id
1
Popeye 8 dic. 2020 a las 15:50

Usando:

select
    res.id
    , res.result_attr
    , res.result
from results as res
where res.result LIKE '%***%' OR res.result = 'INCORRECT';

db & lt; & gt; fiddle demo

0
Lukasz Szozda 8 dic. 2020 a las 15:30