Tiêu chí ROWS và RANGE
Bài học 12 trên 13 trong khóa học SQL nâng cao của Coddy.
Hiện tại, chúng ta không thể linh hoạt chọn số hàng trước hoặc sau cần tính đến. Giờ đây, ta có thể làm điều đó bằng tiêu chí ROWS và RANGE. Để dùng chúng, ta viết:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
Ta có thể chỉ định các tùy chọn sau:
CURRENT ROW- hàng hiện tạin PRECEDING- các hàng trước hàng hiện tạin FOLLOWING- các hàng sau hàng hiện tại
Điểm khác biệt giữa tiêu chí ROWS và RANGE là ROWS không xét đến giá trị mà chỉ xét vị trí, trong khi RANGE xác định cửa sổ dựa trên phạm vi giá trị thay vì vị trí hàng.
Với RANGE, ta phải chỉ định ORDER BY --column_name--, vì nếu không, nó sẽ không biết cách chọn cửa sổ.
Ví dụ:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWINGỞ đây, câu lệnh tạo một cửa sổ gồm hàng hiện tại, hàng phía trước và hàng phía sau.
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levelsỞ đây, câu lệnh tạo một cửa sổ cho mỗi cấp độ, được sắp xếp theo thứ tự tăng dần, gồm cấp độ hiện tại, một cấp độ phía trước và một cấp độ phía sau. Nếu cấp độ hiện tại là 5 thì cửa sổ sẽ gồm các cấp độ 4, 5 và 6.
Lưu ý: Dùng RANGE BETWEEN có thể khiến cửa sổ của bạn gồm nhiều hàng hơn, vì tiêu chí này bao gồm tất cả các hàng có cùng giá trị với các giá trị trong phạm vi, còn ROWS BETWEEN luôn bao gồm cùng một số hàng, miễn là tập dữ liệu có đủ hàng.
Ngoài ra, RANGE không hỗ trợ các cột ngày tháng.
Thử thách
DễTrong thử thách này, chúng ta có dữ liệu về số báo được in. Ta muốn biết số báo trung bình được in trong hai ngày trước hàng hiện tại và một ngày sau đó. Ngoài ra, ta muốn biết chênh lệch giữa số báo được in nhiều nhất và ít nhất, tính từ ngày hiện tại đến cả ba ngày trước đó. Đặt tên cho các cột này lần lượt là avg_newspapers và diff_newspapers.
Tự làm thử
Tất cả bài học trong SQL nâng cao
Tự luyện tập: Trình biên dịch Python online