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.
Vous pouvez également utiliser des déclencheurs Oracle – Vijay
@john: Je ne sais pas qu'ils ont également créé une version pour SQL Server ;-) – Tomalak