Trouver la différence de temps entre deux lignes consécutives dans la même table dans sql
Je suis coincé. J'ai cherché une réponse, mais n'arrive pas à trouver en soustrayant le temps dans le même tableau de deux lignes différentes de la même table qui s'adapte. Je vais avoir un moment difficile avec la requête suivante. Dans le tableau ci-dessous, je tiens à différencier le Délai d'attente d'une ligne à l'TimeIn de la ligne suivante. Envisager dans le tableau suivant pour trouver la différence en minutes entre le Délai d'attente dans la Ligne 1 (10:35) et le TimeIn dans la Ligne 2 (10:38am).
Tableau 1: TIMESHEET
ROW EmpID TimeIn TimeOut
----------------------------------------------------------------
1 138 2014-01-05 10:04:00 2014-01-05 10:35:00
2 138 2014-01-05 10:38:00 2014-01-05 10:59:00
3 138 2014-01-05 11:05:00 2014-01-05 11:30:00
Résultats attendus
ROW EmpID TimeIn TimeOut Minutes
----------------------------------------------------------------------------
1 138 2014-01-05 10:04:00 2014-01-05 10:35:00
2 138 2014-01-05 10:38:00 2014-01-05 10:59:00 3
3 138 2014-01-05 11:05:00 2014-01-05 11:30:00 6
etc
etc
etc
En gros, j'ai besoin de différencier la fois dans la requête pour montrer combien de temps les employés étaient en pause.
J'ai essayé de faire une jointure, mais cela ne semble pas fonctionner et je ne sais pas si OVER
avec PARTITION
est le chemin à parcourir, parce que je n'arrive pas à suivre la logique (Oui, je suis encore à apprendre). J'envisage également de deux tables temporaires et de les comparer, mais ça ne marche pas quand j'ai commencer à changer les jours ou ID de l'employé. Enfin, je pense peut-être LEAD
dans un OVER
déclaration? Ou est-ce juste simple de faire une DATEDIFF
avec un CAST
?
lead(TimeIn) over (partition by EmpId order by TimeIn)
.J'ai juste regardé ce fil au FIL de la PARTITION d'affaires. C'est la première raison convaincante que j'ai vu pour SQL 2012 ou 2014. La question est balisé sql-server-2008, peut-être cela devrait être changé.
OriginalL'auteur NWHikerOR | 2014-09-30
Vous devez vous connecter pour publier un commentaire.
J'ai résolu ce problème pour des problèmes similaires et il n'a pas besoin d'être que les lignes même être triés:
Laissez-moi savoir si cela fonctionne.
Voici un sql violon: http://sqlfiddle.com/#!3/89a43/1
OriginalL'auteur SS781
essayer quelque chose comme ça:
c'est toujours un compromis entre "normalisé" de la structure et de pré-champs calculés, si vous avez besoin d'un rapport de temps - il suffit d'ajouter de l'indice (emp,la ligne délai d'attente), si vous en avez besoin souvent des déclencheurs est le chemin à parcourir
j'aime bien, il est comme le mien, mais semble plus propre. les performances devraient être similaires, diriez-vous que @Lashane ?
Je suppose que groupe par fonctionnera plus lentement, de toute façon, vous pouvez vérifier à la fois dans sql de violon et de comparer les plans d'exécution
ils sont très similaires dans la performance...cependant, je dirais que ma logique est mieux car il est indépendant de la présence d'un numéro de ligne
OriginalL'auteur Iłya Bursov
Puisque vous avez mentionné clause PARTITION, donné ci-dessous est une version à l'aide de la clause (ne l'ai pas testé pour la syntaxe, mais il devrait vous donner l'idée)
OriginalL'auteur Chandu
OriginalL'auteur Radhakrishnan V
Tout en parcourant un curseur est normalement une triste façon de faire les choses à la fois d'un point de vue performances et en termes de provability et de maintenabilité, dans ce cas, où vous traversez les arêtes d'un graphe dirigé acyclique, une boucle peut être juste ce que le médecin a ordonné.
À mon avis, vous avez deux bonnes options lors de l'utilisation de versions de SQL Server qui ne supportent pas d'avance SUR la PARTITION.
De savoir si cela vaut la peine de rassembler toutes les de support de vie pour LINQ dépend de ce que vous faites.
La question est balisé sql-server-2008 qui ne pas soutien d'avance SUR la PARTITION, et sur cette plate-forme en l'absence de soutien des index, il est beaucoup plus rapide avec beaucoup moins de travail configuré pour utiliser un curseur.
OriginalL'auteur Peter Wone