sql >> Databasteknik >  >> RDS >> Sqlserver

Använder GROUP BY med FIRST_VALUE och 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

En lösning nära din nuvarande. Det finns två ställen du gjorde fel.

  1. FIRST_VALUE OCH LAST_VALUE är Analytiska funktioner , som fungerar på ett fönster eller en partition, istället för en grupp. Du kan köra den kapslade frågan ensam och se resultatet.
  2. LAST_VALUE är det sista värdet för det aktuella fönstret, som inte anges i din fråga, och ett standardfönster är rader från den första raden i den aktuella partitionen till aktuella raden . Du kan antingen använda FIRST_VALUE med avseedningsordning eller ange ett fönster

    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,
    


  1. #1064 fel med INSERT INTO

  2. Flera frågedata till en enda HTML-tabell (PHP, MySQL)

  3. VÄLJ rader med minsta antal(*)

  4. Kan jag använda Parallel.For med sql-kommandon?