Mysql
 sql >> Base de données >  >> RDS >> Mysql

Référencement des valeurs de lignes suivantes et précédentes

Supposons qu'il existe une colonne d'identifiant unique et pour rendre les choses intéressantes, elle ne suit pas les augmentations de la colonne d'horodatage. Supposons également qu'il n'y a pas d'horodatages égaux.

select pt.* from
(Select max(ptime) as prevtime,min(ntime) as nextime from
((Select timestamp as ptime) as prev,
(Select timestamp as ntime) as next
where prev.ptime < next.ntime and prev.id<>next.id) as s1 group by ptime, ntime) as pn
inner join 
t as pt on pn.prevtime=pt.timestamp inner join 
t as nt on pn.nexttime=nt.timestamp
where pt.ncol!=nt.ncol;

Explication :s1 fournit des paires d'heures qui se suivent et se précèdent. pn les regroupe pour obtenir une liste de toutes les paires d'heures adjacentes. pt fournit le reste des colonnes pour la fois précédente dans pn, et nt fournit le reste des colonnes pour la prochaine fois. Lorsque la colonne que j'ai nommée ncol change de valeur, la ligne précédente est rejetée dans le jeu de résultats. S'il y a plusieurs valeurs non nulles et qu'il était seulement intéressant de trouver les commutateurs entre null et non nul, alors remplacez pt.ncol!=nt.ncol par isnull(pt.ncol)!=isnull(nt.ncol).