2017-01-09 1 views
1

J'ai une table mysql avec des données connectées à la date et l'heure. Chaque ligne dispose de données et une date, comme celui-ci:Sélectionnez toutes les données différentes secondes entre deux dates fois

datetime    name 
2009-06-25 10:00:00 jhon 
2009-06-25 10:00:05 jack 
2009-06-25 10:00:11 json 
2009-06-25 10:00:15 jack 

Mon problème est que je dois obtenir les lignes différentes secondes date1 et date2 comme ceci:

datetime    name  second 
2009-06-25 10:00:00 jhon  0 
2009-06-25 10:00:05 jack  5 
2009-06-25 10:00:11 json  6 
2009-06-25 10:00:15 jack  4 

Merci

+0

À droite, je vais supprimer le commentaire –

+0

utiliser self join pour obtenir ce –

Répondre

1

La fonctionnalité vous cherchez est LAG, qui est disponible comme une fonction analytique dans de nombreuses bases de données, mais pas dans MySQL. Cependant, vous pouvez simuler cette fonctionnalité en utilisant des variables de session.

SET @dt = (SELECT MIN(UNIX_TIMESTAMP(datetime)) FROM yourTable); 

SELECT t.datetime, 
     t.name, 
     t.curr_dt - t.lag_dt AS second 
FROM 
(
    SELECT @dt:=UNIX_TIMESTAMP(datetime) curr_dt, 
      @dt lag_dt, 
      datetime, 
      name 
    FROM yourTable 
    ORDER BY datetime, name 
) t 
+0

Ceci est l'approche est assez rapide – sumit

+0

@tim .. il montre la différence des secondes à zéro dans toutes les lignes ..non selon l'utilisateur prévu ..http: // sqlfiddle .com/#! 9/a295e8/3 –

+0

@AnkitAgrawal Les variables de session ne semblent pas fonctionner dans Fiddle. Vous devez le tester dans Workbench. –

0

Le résultat est le suivant:

[SQL] SET @dt = (SELECT MIN UNIX_TIMESTAMP (datetime) à partir de gps_trs_location); [Err] 1064 - Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité « (datetime) DE gps_trs_location) » à la ligne 1

+0

Désolé, typo, utilisez ceci: 'SET @dt = (SELECT MIN (UNIX_TIMESTAMP (datetime)) DE VOTRETABLE);' –

1

Vous pouvez trouver la date la plus proche et trouver la différence comme ci-dessous

select 
    datetime, 
    name, 
    TIME_TO_SEC(TIMEDIFF(datetime, prev_date)) diff 
    FROM 
    (
     SELECT 
     datetime, 
     name, 
     (select datetime from tbl t1 where t1.datetime<tbl.datetime order by datetime desc limit 1) as prev_date 
     FROM 
     `tbl` 
    )tmp 
+0

Ceci est une bonne alternative à la réponse que j'ai donnée, et devrait être bien pour les ensembles de données de taille raisonnable. –