2009-08-13 6 views
0

Il y a une table avec des colonnes comme ci-dessous:SQL - Requête pour revenir résultat

Id : long autoincrement; 
timestamp:long; 
price:long 

Timestamp est donnée comme unix_time en ms.

Question: Quelle est la différence de temps moyenne entre les enregistrements?

+0

base de données Oracle 10g. – Siv

+0

@Marc, votre deuxième requête donne le bon résultat. merci beaucoup. – Siv

+0

OK, supprimé ma réponse afin que vous puissiez upvote :-) Merci! Mais soyez conscient du commentaire d'Adam qui est tout à fait vrai - ma requête ne fonctionne que si les ID sont séquentiels et ne comportent aucun espace. –

Répondre

1

Dans SQL Server, vous pouvez écrire quelque chose comme ça pour obtenir cette information:

SELECT 
    t1.ID, t2.ID, 
    DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime) 
FROM table t1 
INNER JOIN table t2 ON t2.ID = t1.ID-1 
WHERE t1.ID > (SELECT MIN(ID) FROM table) 

et si vous re seulement intéressé par l'AVG à travers toutes les entrées, vous pouvez utiliser:

SELECT 
    AVG(DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime)) 
FROM table t1 
INNER JOIN table t2 ON t2.ID = t1.ID-1 
WHERE t1.ID > (SELECT MIN(ID) FROM table) 

Fondamentalement, vous devez joindre la table avec lui-même, et utiliser "t1.ID = t2.ID-1" pour associer le numéro d'article. 2 dans un tableau avec l'article no. 1 dans l'autre tableau, puis calculez la différence de temps entre les deux. Afin d'éviter d'accéder à l'article no. 0 qui n'existe pas, utilisez la clause "T1.ID> (SELECT MIN (ID) FROM table)" pour démarrer à partir du deuxième élément.

Marc

+2

Cela ne fonctionnera que s'il n'y a pas d'espace dans l'ID. –

+0

@Adam: vrai - bon point –

+0

OK, ça veut dire que ça marche vraiment - voir le commentaire de OP - puisque c'est une colonne "AUTOINCREMENT", il y a de fortes chances que ce soit sans lacunes (mais pas garanti) :-) –

0

A une supposition:

SELECT AVG(timestamp)

Je pense que vous devez fournir plus d'informations dans votre question pour nous d'aider.

+0

supposons qu'il existe n enregistrements. question est comme le décalage horaire moyen entre les enregistrements? ici, difficile est la différence entre les enregistrements. cam vous me dire quel type d'information avez-vous besoin de plus? – Siv

0

Si vous voulez dire la différence entre chaque-autre rangée:

select AVG(x) from (
select a.timestamp - b.timestamp as x 
from table a, table b -- this multiplies a*b) sub 
+0

Je n'ai qu'une seule table et plusieurs enregistrements. besoin entre les enregistrements le temps diff. pas avec plusieurs tables. – Siv

+0

bien, mais cela va associer chaque entrée avec chaque autre entrée, par ex. vous obtenez entry1 - enty1, entry1-entry2, entry1-entry3 et ainsi de suite - la moyenne ne sera pas juste entre les entrées qui sont «voisins» les uns des autres ...... –

+0

@Siv - cette requête utilise exactement 1 table - mais en sélectionne deux (en utilisant alias a, b) – Dewfy

0
SELECT AVG(T2.Timestamp - T1.TimeStamp) 
    FROM Table T1 
    JOIN Table T2 ON T2.ID = T1.ID + 1 
+0

Ma supposition était (et vous savez où vous obtenez) était l'OP était intéressé par la différence moyenne entre les enregistrements consécutifs. T2.ID ne peut pas être 'au-delà de la plage des ID valides' car il n'y a pas d'enregistrement là-bas! – n8wrl

+1

Toute lacune dans la colonne Id entraînerait une rupture. –

+0

@Adam: Oops - vous avez raison! – n8wrl

3

première pensée est une sous-requête saisissant immédiatement l'enregistrement précédent:

SELECT timestamp - 
(select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc) 
FROM Table 

Ensuite, vous pouvez prendre la moyenne que:

SELECT AVG(delta) 
from (SELECT timestamp - 
    (select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc) as delta 
    FROM Table) T 

Il faudra probablement être une manipulation de la null qui résulte pour la première rangée, mais je n'ai pas testé pour être sûr.

+0

Vous devrez ajuster la partie "top 1" à l'équivalent Oracle, cela fait trop longtemps que j'ai travaillé avec Oracle. –

0

essayer cette

Select Avg(E.Timestamp - B.Timestamp) 
    From Table B Join Table E 
     On E.Timestamp = 
      (Select Max(Timestamp) 
      From Table 
      Where Timestamp < R.Timestamp) 
Questions connexes