J'ai une table comme celle-ci:












Ce que je veux sortir est (dans cet ordre) en éliminant les doublons continus mais pas tous les doublons:
100
300
500
300
400
100

Je ne peux pas sélectionner Distinct, car cela éliminera les secondes instances de 300, 100. Existe-t-il un moyen d'obtenir ce résultat dans MySQL? Merci!

2
Berty 25 juil. 2017 à 04:17

2 réponses

Meilleure réponse

Vous souhaitez obtenir la valeur précédente. Si les dates n'ont vraiment pas de lacunes ou de doublons, faites simplement:

select t.*
from t left join
     t tprev
     on t.col1 = date_add(tprev.col1, interval 1 day)
where tprev.col2 is null or tprev.col2 <> t.col2;

ÉDITER:

Si les dates ne remplissent pas ces conditions, vous pouvez utiliser des variables:

select t.*
from (select t.*,
             (@rn := if(@v = col2, @rn + 1,
                        if(@v := col2, 1, 1)
                       )
             ) as rn
      from t cross join
           (select @v := 0, @rn := 0) params
      order by t.col1
     ) t
where rn = 1;

Notez que MySQL ne garantit pas l'ordre d'évaluation des expressions dans SELECT. Ainsi, les variables ne doivent pas être affectées dans une expression, puis utilisées dans une autre - elles doivent être affectées dans une seule expression.

0
Gordon Linoff 25 juil. 2017 à 01:30

Vous pouvez utiliser les fonctions de décalage et d'avance.

select y from (select y , lag(y,1,0) over (order by x) as prev_y from t1) where y <> prev_y;
0
Bharadwaj T 25 juil. 2017 à 04:52