J'ai un tableau avec les colonnes suivantes
application_uuid changed_at_utc changed_by name
Je voudrais sortinger par application_uuid
et changed_at_utc
. Ensuite, je veux filterr seulement pour les lignes qui viennent directement après les lignes où application_status
a le text 'Ready for Scoring'
Avec Python et Pandas, je ferais quelque chose comme ça …
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]
Comment puis-je faire la même chose en utilisant SQL?
En fonction de votre explication, vous pouvez utiliser la fonction lead
pour cela.
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'
Si cela doit être fait pour chaque application_uuid
, incluez une partition by
en lead
comme ci-dessous.
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'
Si vous avez besoin de toutes les lignes après l'application_status Ready for Scoring
, obtenez l'horodatage de cette ligne spécifique et choisissez tous les autres horodatages qui sont plus grands. Cela suppose qu'un application_uuid aura au plus une ligne avec le statut 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