2013-08-09 4 views
0

J'ai données dans le tableau postgreSQL comme suit,rang PostgresSQL requête

pkid id timestamp    isactive 
----------------------------------------- 
    1 1 "2013-08-08 10:10:10" 0 
    2 1 "2013-08-08 10:11:10" 0 
    3 1 "2013-08-08 10:12:10" 0 
    4 1 "2013-08-08 10:13:10" 1 
    5 1 "2013-08-08 10:14:10" 1 
    6 1 "2013-08-08 10:15:10" 1 
    7 1 "2013-08-08 10:16:10" 1 
    8 1 "2013-08-08 10:17:10" 1 
    9 1 "2013-08-08 10:18:10" 0 
    10 1 "2013-08-08 10:19:00" 0 
    11 2 "2013-08-08 09:10:10" 0 

Je veux obtenir une requête pour obtenir premier enregistrement lorsqu'il change d'actif à l'état inactif ou vice-versa, par exemple pour chaque ID,

1 1 "2013-08-08 10:10:10" 0 
    4 1 "2013-08-08 10:13:10" 1 
    9 1 "2013-08-08 10:18:10" 0 
    11 2 "2013-08-08 09:10:10" 0 

J'ai essayé d'utiliser le rang() mais attribuer une valeur de rang à travers le actif/inactif, ce rang() (partition par identifiant, par ordre isActive horodatage)

pkid id timestamp    isactive rank 
---------------------------------------------- 
    1 1 "2013-08-08 10:10:10" 0  1 
    2 1 "2013-08-08 10:11:10" 0  2 
    3 1 "2013-08-08 10:12:10" 0  3 
    4 1 "2013-08-08 10:13:10" 1  1 
    5 1 "2013-08-08 10:14:10" 1  2 
    6 1 "2013-08-08 10:15:10" 1  3 
    7 1 "2013-08-08 10:16:10" 1  4 
    8 1 "2013-08-08 10:17:10" 1  5 
    9 1 "2013-08-08 10:18:10" 0  4 
    10 1 "2013-08-08 10:19:00" 0  5 
    11 2 "2013-08-08 09:10:10" 0  1 

je voudrais voir le résultat que,

pkid id timestamp    isactive rank 
--------------------------------------------- 
    1 1 "2013-08-08 10:10:10" 0   1 
    2 1 "2013-08-08 10:11:10" 0   2 
    3 1 "2013-08-08 10:12:10" 0   3 
    4 1 "2013-08-08 10:13:10" 1   1 
    5 1 "2013-08-08 10:14:10" 1   2 
    6 1 "2013-08-08 10:15:10" 1   3 
    7 1 "2013-08-08 10:16:10" 1   4 
    8 1 "2013-08-08 10:17:10" 1   5 
    9 1 "2013-08-08 10:18:10" 0   1 
    10 1 "2013-08-08 10:19:00" 0   2 
    11 2 "2013-08-08 09:10:10" 0   1 

je peux alors choisir tous les rangs == 1 et obtenir l'horodatage lorsque l'état a changé.

+0

De telles requêtes «quand l'état a changé» sont souvent mieux faites en comparant 'state = lag (state)'. –

Répondre

1

Vous pouvez le faire est en utilisant la fonction lag():

select t.* 
from (select t.*, 
      lag(isactive) over (partition by id order by timestamp) as prevIsActive 
     from t 
    ) t 
where prevIsActive is NULL or prevIsActive <> IsActive; 

Vous ne pouvez le faire de la façon dont vous l'avez dit, si l'Etat ne va que dans un sens - de l'état inactif à actif ou vice-versa. Votre méthode combine tous les actifs et les inactifs ensemble pour un identifiant, ce qui entraîne la numérotation continue.