Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Menggunakan GROUP BY dengan FIRST_VALUE dan 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

Solusi yang mendekati solusi Anda saat ini. Ada dua tempat yang Anda lakukan salah.

  1. FIRST_VALUE DAN LAST_VALUE adalah Fungsi Analitik , yang bekerja pada jendela atau partisi, bukan grup. Anda dapat menjalankan kueri bersarang sendirian dan melihat hasilnya.
  2. LAST_VALUE adalah nilai terakhir dari jendela saat ini, yang tidak ditentukan dalam kueri Anda, dan jendela default adalah baris dari baris pertama partisi saat ini ke baris saat ini . Anda dapat menggunakan FIRST_VALUE dengan deseeding order atau menentukan jendela

    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. Bagaimana Anda membuat cadangan dan memulihkan database sebagai salinan di server yang sama?

  2. cara memeriksa keunikan (non duplikasi) dari sebuah posting di rss feed

  3. Partisi tabel menggunakan 2 kolom

  4. Mengapa T-SQL ISNULL() memotong string dan COALESCE tidak?

  5. 5 Trik untuk Memastikan Kinerja Puncak SQL Server