Vấn đề:
Trong tập kết quả, bạn muốn phân vùng các bản ghi và xếp hạng các hàng trong mỗi phân vùng, thêm một cột khác để hiển thị thứ hạng của các hàng trong phân vùng.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên là tạp chí với dữ liệu trong các cột sau:id
(khóa chính), name
, category
và price
.
id | tên | loại | giá |
---|---|---|---|
105 | Cuộc sống đồng quê | lối sống | 1,70 |
108 | Tạp chí Tin tức | tin tức | 3,35 |
115 | Decibel | âm nhạc | 6,50 |
123 | Tạp chí Trống | âm nhạc | 6,50 |
145 | Hoàng hôn | lối sống | 12,00 |
155 | Thế giới | lối sống | 9,50 |
158 | Bàn phím | âm nhạc | 8,45 |
Hãy nhóm tạp chí theo danh mục và xếp hạng từng nhóm theo thứ tự giảm dần theo giá . Hiển thị vị trí xếp hạng, tên, danh mục và giá cho mỗi tạp chí.
Giải pháp:
SELECT category, name, price, RANK() OVER (PARTITION BY category ORDER BY price DESC ) AS price_rank FROM magazine;
Đây là kết quả:
loại | tên | giá | price_rank |
---|---|---|---|
lối sống | Hoàng hôn | 12,00 | 1 |
lối sống | Thế giới | 9,50 | 2 |
lối sống | Cuộc sống đồng quê | 1,70 | 3 |
âm nhạc | Bàn phím | 8,45 | 1 |
âm nhạc | Decibel | 6,50 | 2 |
âm nhạc | Tạp chí Trống | 6,50 | 2 |
tin tức | Tạp chí Tin tức | 3,35 | 1 |
Thảo luận:
Để phân vùng các hàng và xếp hạng chúng theo vị trí của chúng trong phân vùng, hãy sử dụng hàm RANK () với mệnh đề PARTITION BY.
Hàm RANK () của SQL cho phép chúng ta thêm vị trí của bản ghi trong tập kết quả hoặc trong mỗi phân vùng. Trong ví dụ của chúng tôi, chúng tôi xếp hạng các hàng trong một phân vùng.
Mệnh đề OVER () luôn đứng sau RANK (). OVER () phải chứa mệnh đề ORDER BY. Nếu bạn đang trả về thứ hạng trong một phân vùng, hãy đặt mệnh đề PARTITION BY bên trong mệnh đề OVER (). PARTITION BY được theo sau bởi một biểu thức hoặc tên cột; trong ví dụ của chúng tôi, chúng tôi sử dụng cột category
(PARTITION BY category
).
Lưu ý: Nếu không sử dụng phân vùng, bạn có thể bỏ qua PARTITION BY và chỉ cần đặt mệnh đề ORDER BY trong OVER ().
Sau PARTITION BY, đặt ORDER BY theo sau là tên của các cột hoặc biểu thức sắp xếp. Trong ví dụ của chúng tôi, chúng tôi đang sắp xếp theo thứ tự giảm dần theo cột price
(ORDER BY price DESC
). Từ khóa DESC cho biết thứ tự sắp xếp giảm dần.
Trong ví dụ trên, việc sử dụng RANK () với PARTITION BY đã chia kết quả được đặt thành các nhóm tạp chí riêng biệt theo danh mục của chúng . Với mỗi nhóm, các hàng được sắp xếp theo giá và sau đó được xếp hạng trong nhóm đó.