2015-06-19 2 views
3

Существует таблица a_status_check со следующими данными:запросов для фильтрации записей на основе конкретных условий

enter image description here

Требования: если LC-статуса и оба они присутствуют, то рассматривать только LC. В противном случае рассмотрим BE. Игнорируйте другие коды для этого идентификатора.

Таким образом, результат должен быть как:

enter image description here

Я попытался дешифровать и CASE-функции, не повезло. Может кому-то помочь.

ответ

1

Используйте аналитические функции:

select distinct 
    id, 
    first_value (status) over (partition by id order by status desc) status, 
    first_value (amt ) over (partition by id order by status desc) amt 
from 
    tq84_a_status_check 
where 
    status in ('LC', 'BE') 
order by 
    id; 

Testdata:

create table tq84_a_status_check (
    id number, 
    status varchar2(10), 
    amt number 
); 

select distinct 
    id, 
    first_value (status) over (partition by id order by status desc) status, 
    first_value (amt ) over (partition by id order by status desc) amt 
from 
    tq84_a_status_check 
where 
    status in ('LC', 'BE') 
order by 
    id; 
+0

Спасибо за запрос. Но значения A и B в статусе использовались для примерного примера, и фактический сценарий может содержать более 1 статуса с разными именами, из которых я должен учитывать только два. Изменение вопроса для объяснения. –

+0

Если интересны только 'BE' и' LC', вы сначала фильтруете их с 'where status in ...' и используете аналитические функции, как и раньше. –

0

Вы можете попробовать это:

SELECT id, status, amt 
FROM yourTable yt 
INNER JOIN (
     -- get only max 
     SELECT id, MAX(status) as status 
     FROM yourTable 
     GROUP BY id 
    ) as onlyMax 
     ON yt.id = onlyMax.id 
     AND yt.status = onlyMax.status 
0

Это решение должно работать если у вас есть только два STATUS значения (А и В). Сначала я получу временную таблицу, содержащую подсчеты STATUS для каждого ID, а затем I JOIN это возвращается к a_status_check. Предложение WHERE сохраняет записи A, когда они появляются отдельно, и сохраняет записи B, когда A и B появляются вместе.

SELECT * FROM a_status_check t1 
INNER JOIN 
(
    SELECT ID, COUNT(*) AS status_count 
    FROM a_status_check 
    GROUP BY ID 
) t2 
ON t1.ID = t2.ID 
WHERE (t1.STATUS = 'A' AND t2.status_count = 1) 
    OR (t1.STATUS = 'B' AND t2.status_count = 2); 
0

Попробуйте это

SELECT id, status, amt 
FROM a_status_check t 
INNER JOIN (
     SELECT id, MAX(status) as status 
     FROM a_status_check 
     GROUP BY id 
    ) as a 
     ON t.id = a.id 
     AND t.status = a.status 
Смежные вопросы