Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на GROUP BY с FIRST_VALUE и 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

Решение, близко до настоящото ви. Има две места, където сте сгрешили.

  1. FIRST_VALUE И LAST_VALUE са аналитични функции , които работят на прозорец или дял, вместо на група. Можете да изпълните вложената заявка самостоятелно и да видите нейния резултат.
  2. LAST_VALUE е последната стойност на текущия прозорец, която не е посочена във вашата заявка, а прозорецът по подразбиране е редовете от първия ред на текущия дял до текущия ред . Можете или да използвате FIRST_VALUE с ред за премахване на зареждане, или да посочите прозорец

    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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Функцията SUM не събира правилно

  2. Съединяване на три маси със съединения, различни от INNER JOIN

  3. Преместване на системни бази данни в клъстера за отказване на SQL Server

  4. Невъзможност за отдалечен достъп до екземпляр на SQL Server 2008 R2

  5. Създаване на таблица с помощта на явен оператор create table срещу select into