2017-02-20 23 views
2

У меня есть таблица со следующими столбцамиSQL Server: Фильтр только для строк непосредственно после строки, содержащей определенный текст

application_uuid 
changed_at_utc 
changed_by 
name 

Я хотел бы сортировать по application_uuid и changed_at_utc. Тогда, я хочу, чтобы отфильтровать только строки, которые приходят непосредственно после строки, в которых application_status имеет текст «Готов к Scoring»

С Python и Панды, я хотел бы сделать что-то вроде этого ...

application_statuses = application_statuses.sort_values(['application_uuid', 'changed_at_utc'], ascending=[True, True]).reset_index(drop=True) 
indexes = application_statuses[application_statuses['application_status']=='Ready for Scoring'].index + 1 
next_statuses = application_statuses.ix[indexes] 

Как я могу сделать то же самое с помощью SQL?

+0

Вы можете показать некоторые данные образца и ожидаемый результат? –

ответ

3

На основе ваших объяснений вы можете использовать функцию lead для этого.

select next_application_status,application_uuid,changed_at_utc,changed_by 
from (select t.*, 
     lead(application_status) over(order by application_uuid,changed_at_utc) as next_appliaction_status 
     from tablename t 
    ) t1 
where application_status = 'Ready for Scoring' 

Если это должно быть сделано для каждого application_uuid, включают в lead как ниже partition by.

select next_application_status,application_uuid,changed_at_utc,changed_by 
from (select t.*, 
     lead(application_status) over(partition by application_uuid order by changed_at_utc) as next_appliaction_status 
     from tablename t 
    ) t1 
where application_status = 'Ready for Scoring' 

Если вам нужно все Ряды после application_status Ready for Scoring, получить временную метку этой конкретной строки и выбрать все остальные временные метки, которые больше. Это предполагает, что application_uuid будет иметь не более одной строки с статусом Ready for Scoring.

select application_status,application_uuid,changed_at_utc,changed_by 
from (select t.*, 
     max(case when application_status='Ready for Scoring' then changed_at_utc end) over(partition by application_uuid) as status_time 
     from tablename t 
    ) t1 
where changed_at_utc > status_time 
+0

Большое спасибо! Это именно то, что я искал –