Một câu đố cho câu hỏi của tôi có thể được tìm thấy trên https://dbfiddle.uk/?rdbms=postgres_10&fiddle=3cd9335fa07565960c1837aa65143685 .
Tôi có một cách bố trí bảng đơn giản:
class
person: belongs to a class
Tôi muốn chọn tất cả các lớp và đối với mỗi lớp, tôi muốn hai định danh người đầu tiên của những người thuộc về được sắp xếp theo tên giảm dần.
Tôi đã giải quyết điều này bằng truy vấn sau:
select c.identifier, array_agg(p.identifier order by p.name desc) as persons
from class as c
left join lateral (
select p.identifier, p.name
from person as p
where p.class_identifier = c.identifier
order by p.name desc
limit 2
) as p
on true
group by c.identifier
order by c.identifier
Lưu ý: Tôi có thể đã sử dụng một truy vấn con tương quan trong SELECT
mệnh đề, nhưng tôi đang cố gắng tránh điều đó như là một phần của quá trình học tập.
Như bạn thấy, tôi đang áp dụng order by p.name desc
ở hai nơi:
- trong truy vấn con
- trong hàm tổng hợp
Có cách nào để tránh điều đó? Chuyến tàu của tôi
Đầu tiên, rõ ràng tôi không thể loại bỏ
order by
truy vấn con, vì điều đó sẽ đưa ra một truy vấn không đáp ứng yêu cầu của tôi như đã nêu ở trên.Thứ hai, tôi nghĩ rằng
order by
hàm tổng hợp không thể bỏ đi, vì thứ tự hàng của truy vấn con không nhất thiết được bảo toàn trong hàm tổng hợp?
Tôi có nên viết lại truy vấn?
(identifier)
chìa khóa chính của class
?