sql >> Database teknologi >  >> RDS >> Sqlserver

Bruger GROUP BY med FIRST_VALUE og 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 tæt på din nuværende. Der er to steder, du gjorde forkert.

  1. FIRST_VALUE OG LAST_VALUE er Analytiske funktioner , som arbejder på et vindue eller en partition i stedet for en gruppe. Du kan køre den indlejrede forespørgsel alene og se resultatet.
  2. LAST_VALUE er den sidste værdi af det aktuelle vindue, som ikke er angivet i din forespørgsel, og et standardvindue er rækker fra den første række af den aktuelle partition til aktuel række . Du kan enten bruge FIRST_VALUE med deseeding-rækkefølge eller angive et vindue

    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. Returner rækker, hvor kolonnen matcher alle værdier i et sæt

  2. Hvordan kan jeg hente binære data ved hjælp af Mysql Python-stik?

  3. Lagring af billeder i databasen mysql

  4. Finmasket adgangskontrol