2017-02-20 2 views
-1

Таблица: CODES_TABLEоракул выберите Mulitple записи 1 на условиях

Serial - Code - DateTime 
A123  B2   01/01/17:14:00 
A124  B2   01/01/17:14:00 
A123  B3   01/01/17:14:05 
A123  B4   01/01/17:14:08 
A124  B3   01/01/17:14:00 
A128  B2   03/01/17:14:00 
A129  B2   03/01/17:14:00 
A129  B4   02/01/17:14:00 

Что Im пытается получить список всех сериальных, которые генерировали код B2, B3 и B4 и породили его в заданном порядке - т.е. B2, а затем B3 затем B4 Так в этом примере - только серийный A123

+0

с тем, что данные таблицы, что ожидаемый результат? – jarlh

+0

Привет, Спасибо за быстрый ответ ... Я ожидаю обратно Serial A123 в приведенном выше примере ... Итак, ive попытался: выберите * из Codes_Table, где ((Code = 'B2') OR ('Code =' B3 ') OR (Code = 'B4')), но не могу на самом деле задуматься о том, как затем проверить, не возникли ли они в порядке даты ... –

+0

Пожалуйста, отредактируйте свой вопрос, чтобы показать [то, что вы пробовали до сих пор] (http : //whathaveyoutried.com). Вы должны включить [mcve] кода, с которым у вас возникают проблемы, тогда мы можем попытаться помочь с конкретной проблемой. Вы также должны прочитать [ask]. –

ответ

1

Предполагая, из входных данных, что каждый code может только больше появляться один раз для serial, это может быть способ:

/* test case */ 
with testTable(Serial,Code, DateTime) as (
    select 'A123', 'B2', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A124', 'B2', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A123', 'B3', to_date('01/01/17:14:05', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A123', 'B4', to_date('01/01/17:14:08', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A124', 'B3', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A128', 'B2', to_date('03/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A129', 'B2', to_date('03/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A129', 'B4', to_date('02/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual 
) 
/* the query */ 
select serial 
from testTable 
group by serial 
having listagg(case when code in ('B2', 'B3', 'B4') then code end) within group (order by dateTime) like '%B2B3B4%' 

Идея состоит в том, чтобы заполнить форму serial, построив для каждого serial строку, содержащую codes, по заказу dateTime.

Если предположить, что каждый code может появиться только один раз для serial единственного serials, которые соответствуют вашему состоянию будет иметь строки, содержащие 'B2B3B4'.

CASE предназначен для обработки футляра, который необходимо проверить, имеет ли серийный номер B2, B3, B5, где может быть даже B4.

Это должно лучше объяснить, как это должно работать:

select serial, listagg(case when code in ('B2', 'B3', 'B4') then code end) within group (order by dateTime) as string 
from testTable 
group by serial; 

SERI STRING 
---- --------------- 
A123 B2B3B4 
A124 B2B3 
A128 B2 
A129 B4B2 
+0

Спасибо Aleksej, поэтому коды (B2 и B3) могут встречаться несколько раз, но код B4 будет когда-либо происходить только один раз - до тех пор, пока перед ним возникнут B2 и B3, - тогда это результат, который я хочу увидеть ... –

+0

Важным здесь является то, что для одного серийного номера вы не имеете более одного «B2», «B3» или «B4»; если они встречаются на разных сериалах, нет проблем – Aleksej

+0

Ты звезда! –

 Смежные вопросы

  • Нет связанных вопросов^_^