Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Sử dụng GROUP BY với FIRST_VALUE và 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

Một giải pháp gần với giải pháp hiện tại của bạn. Có hai chỗ bạn đã làm sai.

  1. FIRST_VALUE VÀ LAST_VALUE là Hàm phân tích , hoạt động trên một cửa sổ hoặc phân vùng, thay vì một nhóm. Bạn có thể chạy một mình truy vấn lồng nhau và xem kết quả của nó.
  2. LAST_VALUE là giá trị cuối cùng của cửa sổ hiện tại, không được chỉ định trong truy vấn của bạn và cửa sổ mặc định là các hàng từ hàng đầu tiên của phân vùng hiện tại đến hàng hiện tại . Bạn có thể sử dụng FIRST_VALUE với thứ tự giảm dần hoặc chỉ định một cửa sổ

    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. Cách thay đổi cột mà không bỏ bảng trong SQL 2008

  2. Mã hóa ký tự mặc định của SQL Server

  3. Làm cách nào để bật và tắt IDENTITY_INSERT bằng SQL Server 2008?

  4. Cập nhật trường XML không có văn bản trong T-SQL

  5. Mọi Bảng Người dùng có nên có Chỉ mục được phân cụm không?