Sử dụng crosstab()
từ mô-đun tablefunc.
SELECT * FROM crosstab(
$$SELECT user_id, user_name, rn, email_address
FROM (
SELECT u.user_id, u.user_name, e.email_address
, row_number() OVER (PARTITION BY u.user_id
ORDER BY e.creation_date DESC NULLS LAST) AS rn
FROM usr u
LEFT JOIN email_tbl e USING (user_id)
) sub
WHERE rn < 4
ORDER BY user_id
$$
, 'VALUES (1),(2),(3)'
) AS t (user_id int, user_name text, email1 text, email2 text, email3 text);
Tôi đã sử dụng báo giá đô la cho tham số đầu tiên, không có ý nghĩa đặc biệt. Thật tiện lợi khi thoát khỏi các dấu nháy đơn trong chuỗi truy vấn, đây là trường hợp phổ biến:
- Chèn văn bản với các dấu ngoặc kép trong PostgreSQL
Giải thích và hướng dẫn chi tiết:
- Truy vấn bảng chéo PostgreSQL
Và đặc biệt, đối với "cột phụ":
- Xoay vòng trên nhiều cột bằng cách sử dụng Tablefunc
Những khó khăn đặc biệt đây là:
-
Thiếu tên khóa.
-> Chúng tôi thay thế bằngrow_number()
trong một truy vấn con. -
Số lượng email khác nhau.
-> Chúng tôi giới hạn ở mức tối đa của ba trongSELECT
bên ngoài
và sử dụngcrosstab()
với hai tham số, cung cấp danh sách các khóa khả thi.
Chú ý đến NULLS LAST
trong ORDER BY
.