Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Usando GROUP BY com FIRST_VALUE e 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

Uma solução próxima da sua atual. Há dois lugares que você errou.
  1. FIRST_VALUE E LAST_VALUE são funções analíticas , que funcionam em uma janela ou partição, em vez de um grupo. Você pode executar a consulta aninhada sozinha e ver seu resultado.

  2. LAST_VALUE é o último valor da janela atual, que não está especificado em sua consulta, e uma janela padrão são as linhas da primeira linha da partição atual até a linha atual . Você pode usar FIRST_VALUE com ordem de deseeding ou especificar uma janela
    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,