Menu
CoddyTech

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ại
  • n PRECEDING - các hàng trước hàng hiện tại
  • n 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.

challenge icon

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