2009-11-06 8 views
0

Comment puis-je calculer la moyenne de chaque 30 secondes? Ce qui suit est la structure de la tableRequête pour obtenir la moyenne toutes les 30 secondes

Price TTime 

chaque minute 5-60 enregistrements insérés. L'heure est insérée par getDate(). Je dois calculer la moyenne de toutes les 30 secondes.

+0

Vous pouvez également utiliser des déclencheurs Oracle – Vijay

+2

@john: Je ne sais pas qu'ils ont également créé une version pour SQL Server ;-) – Tomalak

Répondre

3

Vous devez faire 2 choses:

  • créer une colonne (dans votre résultat SELECT, pas dans le tableau) qui contient le temps en demi-minutes;

  • calculer la moyenne des prix à l'aide d'AVG (Prix) et GROUP BY:

    SELECT <function returning half minutes from TTime> AS HalfMinute, AVG(Price) FROM <Table> GROUP BY HalfMinute` 
    

Je ne sais pas les fonctions de temps de SQL Server. Si vous pouvez obtenir le temps retourné en secondes, vous pouvez aller avec SECONDS/30. Peut-être que quelqu'un d'autre peut intervenir avec des détails ici.

+0

Smotricz, actuellement je calcule pour chaque minute en utilisant la requête suivante. sélectionnez AVG (prix), DatePart (mi, ttime) du groupe TABLE1 par DatePart (mi, ttime) Trier par 2 DatePart (s, ttime) me donnerait la deuxième partie de la date. la partie compliquée est chaque 30 secondes. – Manjoor

+0

Ah, ensemble on peut lécher ça. Je suggérerais la solution de Tomalak, mais substituer Floor (SECOND (TTIME)/30) comme dernière partie de l'expression de groupement. –

0

Quelque chose comme:

SELECT 
    AVG(Price) AS AvgPrice, 
    COUNT(Price) AS CountPrice, 
    MIN(TTIME) AS PeriodBegin, 
    (SECOND(TTime) % 30) * 30 AS PeriodType /* either 0 or 30 */ 
FROM 
    PriceTable 
GROUP BY 
    YEAR(TTime), MONTH(TTime), DAY(TTime), HOUR(TTime), MINUTE(TTime) 
    SECOND(TTime) % 30 /* either 0 or 1 */ 
ORDER BY 
MIN(TTime) 

Au lieu de:

GROUP BY 
    YEAR(TTime), MONTH(TTime), DAY(TTime), HOUR(TTime), MINUTE(TTime) 

vous pouvez aussi utiliser, par exemple:

GROUP BY 
    LEFT(CONVERT(varchar, TTime, 120), 16) 

Dans tous les cas, ceux-ci sont un fonctionnement qui appellent une table scan, car ils ne sont pas indexables. Une clause WHERE permettant de déterminer la plage TTime valide est conseillée.

Vous pouvez également créer une colonne contenant la date calculée ('…:00.000' ou '…:30.000') et remplir celle-ci sur INSERT à l'aide d'un déclencheur. Placez un index dessus, GROUP BY, done.

+0

Thaks les gars, Malheureusement, ce n'est pas à des fins de reporting. Je dois calculer la corrélation. un jeton de troisième colonne est là, sur lequel, la corrélation serait calculée. – Manjoor

Questions connexes