Requête pour calculer la moyenne de temps entre les événements successifs
Ma question est sur la façon d'écrire une requête SQL pour calculer la moyenne de temps entre les événements successifs.
J'ai un petit tableau:
event Name | Time
stage 1 | 10:01
stage 2 | 10:03
stage 3 | 10:06
stage 1 | 10:10
stage 2 | 10:15
stage 3 | 10:21
stage 1 | 10:22
stage 2 | 10:23
stage 3 | 10:29
Je veux construire une requête pour obtenir une réponse de la moyenne des temps entre l'étape(i) et l'étape(i+1).
Par exemple,
le délai moyen entre l'étape 2 et l'étape 3 est 5:
(3+6+6)/3 = 5
Tellement plus facile à faire dans LINQ ...
Qu'est-ce que dialecte SQL que vous travaillez avec?
Qu'est-ce que dialecte SQL que vous travaillez avec?
OriginalL'auteur Tsion | 2009-12-22
Vous devez vous connecter pour publier un commentaire.
Aaaaand avec une pincée de magie noire:
Cela va vous donner des lignes comme:
La première colonne est le départ de l'événement, la deuxième colonne est la fin de l'événement. Si il y a 3 Événement juste après l'Évènement 1, qui seront énumérées. Sinon, vous devez fournir certains critères relatifs à la phase qui suit la scène, de sorte que les temps sont calculés uniquement entre ceux-ci.
Ajouté: Cela devrait fonctionner sur OK sur les deux Transact-SQL (MYSQL, Sybase) et PL/SQL (Oracle, PostgreSQL). Cependant, je n'ai pas testé et il pourrait toujours y avoir des erreurs de syntaxe. Cela ne fonctionnera PAS sur n'importe quelle version de MySQL.
+1 belle solution.
En fait cette requête permettra également de vous donner
stage 3 stage 1 150
. Il n'est pas clair à partir des exigences à savoir si cela est souhaité. Je suppose qu'il ne l'était pas.Merci pour les commentaires sur ma solution, puis de voler de prétendre comme le votre, et même pas jusqu'à droit de vote de la mine...
Vilx du code diffère de la vôtre (par exemple, vous n'utilisez pas de group by), c'est mieux présenté et expliqué.
OriginalL'auteur Vilx-
Les paramètres peuvent être changés comme le nombre d'étapes des changements. C'est actuellement mis en place pour trouver la moyenne entre les étapes 1 et 2 à partir de 3 étapes.
MODIFIER quelques fautes de frappe
Je n'ai pas vu votre solution lors de l'écriture de mon propre. Mais si c'est un upvote vous voulez - vous pouvez y aller! 🙂
Merci. Je me sens vraiment petite en disant ça, mais j'ai été coincé juste en dessous de 500 pour un certain temps, et il y avait plusieurs retags je voulais faire.
OriginalL'auteur David Oneill
Votre table de la conception est erronée. Comment pouvez-vous dire qui stage1 va avec qui stage2? Sans un moyen de le faire, je ne pense pas que votre requête est possible.
HLGEM a un point. Nous devons présumer que c'est sérialisé processus - qui est, la Phase 1 ne peut jamais commencer alors que l'Étape 3 est en cours d'exécution. Mais dans la vraie vie, la plupart des processus multi-thread et multi-utilisateur, de sorte que nous aurions besoin d'un identificateur supplémentaire pour isoler les cours d'eau.
OriginalL'auteur HLGEM
Le moyen le plus facile serait de l'ordre par le temps et l'utilisation d'un curseur (tsql) pour itérer sur les données. Depuis les curseurs sont mal, il est conseillé de récupérer les données commandé par le temps dans le code de votre application et l'itération. Il y a probablement d'autres façons de le faire en SQL, mais ça va être très compliqué, et compter sur la non-standard des extensions de langage.
OriginalL'auteur Manu
Vous ne dites pas quelle saveur de SQL, vous voulez la réponse. C'est probablement ce qui signifie que vous souhaitez que le code de SQL Server (comme [sql] couramment = [sql server] dans l'utilisation des balises).
Mais juste au cas où vous (ou un futur chercheur) sont de l'utilisation d'Oracle, ce genre de requête est assez simple avec des fonctions analytiques, dans ce cas
LAG()
. Check it out:Le changement de format de la requête interne est nécessaire parce que j'ai stocké le TEMPS de colonne de type de données de DATE, donc je le convertir en secondes pour rendre les mathématiques plus clair. Une autre solution serait de travailler avec
Day to Second Interval
type de données à la place. Mais cette solution est vraiment tout surLAG()
.modifier
Dans mon prendre sur cette requête, j'ai pas explicitement calculé la différence entre un avant l'Étape 3 et l'Étape suivante 1. C'est une question d'exigence.
OriginalL'auteur APC
Cela repose sur le fait que vous avez toujours groupes complets de ces étapes et ils vont toujours dans le même ordre (qui est,
stage 1
puisstage 2
puisstage 3
)@meriton
: vous avez raison.OriginalL'auteur Quassnoi
Je ne peux pas commenter, mais je suis d'accord avec HLGEM. Alors que vous pouvez dire avec le jeu de données, les OP doivent être conscients que le fait de compter sur un seul jeu de stades existant à un moment peut-être trop optimiste.
Nous ne savons pas l'environnement ou qu'est-ce que la création des données. C'est à l'OP, pour décider si la table est correctement construit.
Oracle serait en mesure de gérer cela avec google Analytics. comme Vilx de réponse.
OriginalL'auteur blacksol
essayer cette
Pour chaque enregistrement représente un Début de scène, cette jointures sql à l'enregistrement qui représente la fin, prend la différence entre l'heure de fin et l'heure de début, et les moyennes de ces différences. Le Pas Existe assure qu'il intermédiaires resultset de commencer les enregistrements rejoint à la fin des enregistrements que comprend le début des enregistrements en tant que s... et la première condition de jointure garantit que seul un enregistrement de fin ( l'un avec le même nom et la prochaine valeur de temps après l'heure de début) est joint à elle...
De voir le jeu de résultats intermédiaires après le rejoindre, mais avant de le moyen est pris, exécutez la commande suivante:
La n'Existe Pas est de faire en sorte que le sql sorties seulement une ligne pour chaque enregistrement qui est le début de chaque eventstage. Elle filtre les enregistrements de Fin d'être sur le côté gauche de la gauche à la jointure de la table alias "s" - parce que, pour ces enregistrements, il n'y a pas d'autres enregistrements avec le même EventName et avec un plus de temps. Pour les enregistrements de Fin, il y en a un autre enregistrement (le début de l'enregistrement) de sorte que la n'existe Pas de filtres.
Je ne suis pas sûr que cela fonctionne...Comment voulez-vous obtenir de l'étape + 1? Cela semble pour obtenir l'intervalle entre les étapes...c'est à dire// étape 1(B) - phase 1(Un). Je crois que la question était de savoir comment obtenir la différence entre les étapes (c// étape 2 - étape 1).
OriginalL'auteur Charles Bretana