Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation de GROUP BY avec FIRST_VALUE et LAST_VALUE

SELECT 
    MIN(MinuteBar) AS MinuteBar5,
    Opening,
    MAX(High) AS High,
    MIN(Low) AS Low,
    Closing,
    Interval
FROM 
(
    SELECT FIRST_VALUE([Open]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 ORDER BY MinuteBar) AS Opening,
           FIRST_VALUE([Close]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 ORDER BY MinuteBar DESC) AS Closing,
           DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 AS Interval,
           *
    FROM #MinuteData
) AS T
GROUP BY Interval, Opening, Closing

Une solution proche de votre actuelle. Il y a deux endroits où vous vous êtes trompé.

  1. FIRST_VALUE ET LAST_VALUE sont des fonctions analytiques , qui fonctionnent sur une fenêtre ou une partition, au lieu d'un groupe. Vous pouvez exécuter la requête imbriquée seule et voir son résultat.
  2. LAST_VALUE est la dernière valeur de la fenêtre actuelle, qui n'est pas spécifiée dans votre requête, et une fenêtre par défaut est constituée de lignes allant de la première ligne de la partition actuelle à la ligne actuelle . Vous pouvez soit utiliser FIRST_VALUE avec l'ordre d'épandage, soit spécifier une fenêtre

    LAST_VALUE([Close]) OVER (PARTITION BY DATEDIFF(MINUTE, '2015-01-01 00:00:00', MinuteBar) / 5 
                ORDER BY MinuteBar 
                ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Closing,