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.
5 Réponses :
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
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)
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
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'));
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.