1
votes

Sélectionnez DateHeure Max et Min pour un utilisateur distinct

J'ai un enregistrement comme ci-dessous

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1        
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1      
   12        2017-04-03 18:30:00       3       2 

Je souhaite obtenir la première heure d'accès et la dernière heure de déconnexion quotidienne (pour chaque jour) pour chaque utilisateur individuel (badge). p >

Comment puis-je faire cela?

L'enregistrement que je souhaite comme ci-dessous

ID(int)      DATA_ORA(timestamp)     BADGE  LETTORE       
   1         2017-04-01 09:30:00       1       1    
   2         2017-04-01 12:30:00       1       2    
   3         2017-04-01 13:30:00       1       1    
   4         2017-04-01 18:30:00       1       2    
   5         2017-04-01 09:30:00       2       1    
   6         2017-04-01 18:30:00       2       2    
   7         2017-04-02 09:30:00       1       1    
   8         2017-04-02 18:30:00       1       2
   9         2017-04-03 09:30:00       3       1    
   10        2017-04-03 12:30:00       3       2    
   11        2017-04-03 13:30:00       3       1    
   12        2017-04-03 18:30:00       3       2 

Est-il possible de faire cela? Merci.

REMARQUE: les identifiants sont auto-incrémentés et LETTORE 1 est l'entrée et LETTORE 2 est la sortie.


0 commentaires

5 Réponses :


0
votes

Vous pouvez utiliser une jointure avec une sous-requête pour le badge 1 et le badge 2

select t1.badge, min_dat, nax_date
from  (
  select  badge, min_(data_ora) min_data
  from my_table
  where lettore  = 1 
  group by badge 
) t1 
INNER JOIN  (
 select  badge, max_(data_ora) max_data
  from my_table
  where lettore  = 2
  group by badge 
) t2  ON t1.badge = t2.badge 


0 commentaires

0
votes

essayez ci-dessous en utilisant une sous-requête corrélée et unissez tous

select * from tablename a
where DATA_ORA in (select min(DATA_ORA) from tablename b where a.badge=b.badge)
union 
select * from tablename a
where DATA_ORA in (select max(DATA_ORA) from tablename b where a.badge=b.badge)


0 commentaires

0
votes

Vous pouvez le faire en regroupant par date, badge et lettre comme:

SELECT date(DATA_ORA),badge,lettore, case when lettore=1 then min(time(data_ora))
                                          when lettore=2 then max(time(data_ora))
                                          else 0
                                     end
FROM table1
group by date(DATA_ORA),badge,lettore


0 commentaires

0
votes

J'aime la réponse @ fa06, mais il manque, que vous voulez les données quotidiennement. alors essayez ceci:

select * from t1 a
where DATA_ORA in (select min(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'))
union
select * from t1 a
where DATA_ORA in (select max(DATA_ORA) from t1 b where a.badge=b.badge GROUP BY DATE_FORMAT(DATA_ORA, '%Y%m%d'));


0 commentaires

0
votes

Voici la version exécutée de votre table et de votre requête qui donne la sortie dans l'ordre souhaité, sur DB-fiddle . Essayez cette requête:

select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,min(data_ora)from EntryExitLogs group by date(data_ora),badge))
    union
    (select * from EntryExitLogs where id in
    (select id from EntryExitLogs where (badge,data_ora)= any 
    (select badge,max(data_ora)from EntryExitLogs group by date(data_ora),badge)))
    order by id;

Je pense qu'il est préférable d'utiliser la colonne ID pour sélectionner les lignes, car la colonne d'horodatage contient des doublons.


0 commentaires