-2
votes

Comment trouver un nombre d'employés actuellement à l'intérieur de la construction?

J'ai une table de présence qui stocke des données telles que celles-ci:

emp_id   Action           Time
   1       IN       2019-12-22 09:00:00
   1       OUT      2019-12-22 09:15:00
   2       IN       2019-12-22 09:00:00
   2       OUT      2019-12-22 09:15:00
   2       IN       2019-12-22 09:30:00


5 commentaires

Très bien alors, allez-y et écrivez la requête.


Quelle version mysql?


Bienvenue Sharad, de son mieux pour lui donner un coup et me montrer de sorte que vous pourriez avoir peu de commentaires sur votre tentative et améliorer


Je pense que ce que vous entendez par "actuellement" consiste à comparer la colonne "Time" à la journée d'aujourd'hui?


un cadeau au bureau? Cela signifie-t-il qu'il y a un père Noël secret?


3 Réponses :


0
votes

TEST

SELECT COUNT(DISTINCT s.emp_id)
FROM sourcetable s
WHERE s.action = 'IN'
  AND NOT EXISTS ( SELECT NULL
                   FROM sourcetable ss
                   WHERE s.emp_id = ss.emp_id
                     AND s.time < ss.time
                     AND ss.action = 'OUT' )


2 commentaires

Je n'ai jamais vu quelqu'un choisir NULL à partir d'une sous-requête corrélée pour pas exister - n'est-ce pas toujours utilisé?


Mais null n'est pas une valeur.



0
votes

Vous pouvez utiliser non pas existant et une sous-requête corrélée, mais je pense que l'utilisation de jointures gauche est claire (il est également plus facile de modifier pour des cas d'utilisation complexes - par exemple dans le bâtiment pendant 5 minutes.)

Premier quand La dernière fois que quelqu'un est venu dans le bâtiment xxx

alors la dernière fois que quelqu'un est sorti xxx

Nous pouvons entrer et comme ceci xxx

si sortie est avant, ils sont dans xxx

* Notez comment vous avez une valeur zéro horodatage dépendra de votre plate-forme.

Si vous ne savez pas comment faire 0, cela fonctionnera, mais vous ne pouvez pas avoir d'intérieur et de sortir exactement la même chose dans les données source Xxx


3 commentaires

@Akina - Bien sûr. Je fais quelque chose d'un peu plus avancé ici. Je montre à la fois comment obtenir des informations sur qui est entré et qui est sortie, mais aussi pour rejoindre celles-ci afin que vous puissiez faire une analyse sur les résultats. Comme j'écris une réponse, j'ai pensé que je devrais tenter de conférer des emporter utiles. Je suis conscient que je n'ai pas répondu directement à la question dans le moins de caractères. Si vous voulez cela, regardez ensuite la réponse de Gordon.


J'ai utilisé une jointe à gauche parce que nous ne sommes pas certains que chaque identifiant d'employé a un enregistrement enregistré et un enregistrement de sortie. Ceci est un modèle standard.


Gauche Rejoignez Akina - Emp_List a la liste complète et les sous-requêtes peuvent avoir un sous-ensemble. Je veux toutes les valeurs dans Emp_List Joignée à d'autres requêtes qui ont moins. Il n'y a pas d'erreur. C'est aussi pourquoi la coalesce est nécessaire.



1
votes

Si vous voulez que le nombre actuel et que vos données soient exactes (pas de duplication et ainsi de suite), utilisez simplement l'agrégation:

select sum(case when action = 'IN' then 1
                when action = 'OUT' then -1
           end)
from attendance;


0 commentaires