2014-11-04 3 views
0

У меня есть таблица в базе данных Oracle 10g со следующими столбцамиподзапроса в Oracle 10G

sdate     sid event 
31/10/2013 20:20:20  1  A  
31/10/2013 20:20:21  1  B 
31/10/2013 20:20:22  1  C 
31/10/2013 20:41:04  2  A  
31/10/2013 20:41:10  2  B 
31/10/2013 20:42:20  2  C  
31/10/2013 20:42:49  2  C 
31/10/2013 21:20:50  3  A 
31/10/2013 21:21:33  3  B 
31/10/2013 21:23:00  3  C 
31/10/2013 21:08:20  4  B  
31/10/2013 21:11:20  4  C 
31/10/2013 21:17:20  4  C 
31/10/2013 22:20:20  5  C 
31/10/2013 22:22:22  5  D 

SDATE является датой этой записи, с.и.д., как сессионный ID, событие это уникальное событие в сеансе, например A, B, C и т. Д. Сессия всегда должна начинаться с одного события события «A». Другие события, такие как B, C, могут повторяться.

Может кто-нибудь, пожалуйста, помогите мне написать запрос, который даст мне список всех SID, которые начинаются с события, отличного от «A», например, sid 4 и 5, потому что сеансы tese начинаются с B и C.

UPDATE: У меня есть сокращенные события A, B, C в реальных событиях в моем столе длинными строками.

ответ

1

Вы можете использовать аналитические функции для этой цели:

select t.* 
from (select t.*, row_number() over (partition by sid order by sdate) as seqnum 
     from table t 
    ) t 
where seqnum = 1 and event <> 'A'; 

row_number() перечисляет события для каждого sid на основе date. Предложение where выбирает первый и все такие строки, где событие не является 'A'.