2017-08-20 2 views
-1

J'ai une table user_status, qui stocke le statut pour chaque utilisateur, chaque fois qu'un statut change, j'applique le statut dans la table user_status.obtenir le dernier enregistrement de la table pour chaque utilisateur

id status  created 
1 ACTIVE  08-10-2017 08:21:22 
1 ACTIVE  08-10-2017 08:21:25 
1 NON_ACTIVE 08-10-2017 08:22:23 
2 NON_ACTIVE 08-10-2017 08:22:23 
2 ACTIVE  08-11-2017 08:25:23 
3 NON_ACTIVE 08-12-2017 08:23:23 

Ce que je cherche est le dernier état pour chaque utilisateur en fonction de la date de création donc la sortie que je suis à la recherche est

id status  created 
1 NON_ACTIVE 08-10-2017 08:22:23 
2 ACTIVE  08-11-2017 08:25:23 
3 NON_ACTIVE 08-12-2017 08:23:23 

aussi une fois que je fais ça, je suis aussi intéressé savoir s'il y a un moyen d'obtenir la seconde au dernier état (une avant le dernier) le statut de chaque utilisateur

donc la sortie de cette requête Je cherche OFR est

1 ACTIVE  08-10-2017 08:21:25 
2 NON_ACTIVE 08-10-2017 08:22:23 
3 NON_ACTIVE 08-12-2017 08:23:23 

toutes les suggestions, I

+0

Qu'avez-vous essayé jusqu'à présent? – tima

Répondre

0

Fenêtre fonctionne à la rescousse!

select t.* 
from (select t.*, 
      row_number() over (partition by id order by created desc) as seqnum, 
      nth_value(status, 2) over (partition by id order by created desc) as second_status 
     from t 
    ) t 
where seqnum = 1; 

Si vous ne voulez pas toutes les colonnes, vous pouvez utiliser l'agrégation conditionnelle:

select t.id, max(t.created) as created, 
     max(case when seqnum = 1 then status end) as last_status, 
     max(case when seqnum = 2 then status end) as second_status, 
from (select t.*, 
      row_number() over (partition by id order by created desc) as seqnum 
     from t 
    ) t 
group by id; 
+0

Une raison pour une rétrogradation anonyme sur ce qui ressemble à une réponse correcte? –

+0

Je ne suis pas sûr de savoir qui a fait le downvote, je suis toujours à la recherche de votre requête. Je ne suis pas sûr de qui a fait le downvote – user641887

+0

@ user641887. . . Il ressemble à un downvoter malveillant, qui a simplement downvoted la question et toutes les réponses. –

0

En regardant votre requête, je vous suggère d'obtenir les détails en une seule fois plutôt que d'obtenir la première statut et ensuite aller pour le second. J'espère que cet extrait ci-dessous aide.

SELECT B.ID, 
    B.STATUS, 
    B.CREATED 
FROM 
    (SELECT A.ID, 
    A.STATUS, 
    CREATED, 
    ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.CREATED DESC) RN 
    FROM 
    (SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:22' CREATED FROM DUAL 
    UNION ALL 
    SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:25' CREATED FROM DUAL 
    UNION ALL 
    SELECT 1 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 2 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 2 ID,'ACTIVE' STATUS,'08-11-2017 08:25:23' CREATED FROM DUAL 
    UNION ALL 
    SELECT 3 ID,'NON_ACTIVE' STATUS,'08-12-2017 08:23:23' CREATED FROM DUAL 
    )A 
)B 
WHERE B.RN IN (1,2); 
/