2015-02-19 4 views
2

Эти ниже все относятся к одной и той же записи в том же файле .... в основном это обозначается как «UNK», пока кто-то не присвоит ей номер продукта. в этом случае номер 12345678 был назначен Павлом 01 января. Каждая запись до/после этого происходит, когда кто-то что-то меняет на этой записи.Oracle SQL Row Number selection

Я хочу, чтобы захватить эту запись, в первый раз, когда она идет от UNK к номеру ... и захватить имя пользователя и дату и т. Д. Из этой строки.

Я пробовал мин, наименее, и я не уверен о rownum или о том, где положить строку, если бы я сделал.

Car_Id Product #  user name  date 
111   unk   john   20Dec 
111   unk   alan   25Dec 
111   unk   pete   30Dec 
111   12345678  paul   01Jan 
111   12345678  jim   10Jan 
222   unk   alan   25Dec 
222   unk   pete   30Dec 
222   87654321  paul   02Jan 
222   87654321  steve   05Jan 

Но в логических терминах я хочу, чтобы это сделало ... дайте мне 1-й отчет после UNK.

Пожалуйста, могу ли я иметь полную строку, если это возможно.

+0

Во-первых, согласно чему? (продукт #, имя пользователя, дата или комбинация? У вас есть несколько элементов с одинаковым именем пользователя и/или датой? – jarlh

+0

Какая база данных вы используете? PostgreSQL, SQL Server, Oracle, MySQL, ... – Andomar

+1

Заголовок говорит Oracle – Marco

ответ

1

Похоже возможно аналитической функции row_number() будет лучшим способом сделать это:

with sample_data as (select 111 car_id, 'unk' product#, 'john' user_name, to_date('20/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 111 car_id, 'unk' product#, 'alan' user_name, to_date('21/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 111 car_id, 'unk' product#, 'pete' user_name, to_date('22/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 111 car_id, '12345678' product#, 'paul' user_name, to_date('23/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 111 car_id, '12345678' product#, 'jim' user_name, to_date('24/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 222 car_id, 'unk' product#, 'alan' user_name, to_date('25/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 222 car_id, 'unk' product#, 'pete' user_name, to_date('26/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 222 car_id, '87654321' product#, 'paul' user_name, to_date('27/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual union all 
        select 222 car_id, '87654321' product#, 'steve' user_name, to_date('28/12/2014 10:12:24', 'dd/mm/yyyy hh24:mi:ss') dt from dual) 
select car_id, 
     product#, 
     user_name, 
     dt 
from (select sd.*, 
       row_number() over (partition by car_id order by dt) rn 
     from sample_data sd 
     where product# != 'unk') 
where rn = 1; 

    CAR_ID PRODUCT# USER_NAME DT     
---------- -------- --------- --------------------- 
     111 12345678 paul  23/12/2014 10:12:24 
     222 87654321 paul  27/12/2014 10:12:24 
+0

спасибо ... я не хочу записи UNK, хотя ... из верхнего списка я хочу найти .. 111 12345678 paul 01Jan ..... и 222 87654321 paul 02Jan ... так как они оба являются 1-й нумерованными записями прямо после ООН. Если я говорю WHERE продукт <> 'UNK' и ROWNUM = 1, он не находит ничего, потому что 1-й rownum является UNK. –

+0

Упс, отредактировал мое сообщение, чтобы добавить в предложение where. – Boneist

+0

Вау, это работает как сон!отлично спасибо :) –

2

Исправьте меня, если я ошибаюсь, но ваши данные, по-видимому, упорядочены по дате, поэтому логически вы можете просто взять первый recoredset, где номер продукта не является «unk».

Select * 
From (SELECT * FROM YourTable orderby date) t -- make sure data is ordered before selecting it 
where t.ProductNr <> 'unk' and -- don't get data without a number 
rownum = 1 -- take the first 
+0

это звучит как правильный путь ... потому что я присоединяюсь к другим файлам, которые, по-видимому, не могут получить его в правильном направлении ........... select blah blah ... из SBH_CAR car left внешнее соединение ( выберите car_id, продукт, MODIFIED_DATE, MODIFIED_BY от sbh_car_aud порядка по MODIFIED_DATE) car1 на car1.car_id = car.car_id ГДЕ CAR1.product <> 'UNK' и ROWNUM = 1 есть я получил что-то круглый Неправильный путь? его высказывание sql не было должным образом закончено, мне нужна скобка где-то? –