Có thể tạo ra một số loại nhóm trong Postgres? Hãy nói rằng tôi có biểu đồ sau:
CREATE TABLE foo AS
SELECT row_number() OVER () AS id, *
FROM ( VALUES
( 'X', 'D', 'G', 'P' ),
( 'F', 'D', 'L', 'M' ),
( 'X', 'N', 'R', 'S' ),
( 'Y', 'I', 'W', NULL ),
( 'U', 'Z', 'E', NULL )
) AS f(a,b,c,d);
id | a | b | c | d
------------------
1 | X | D | G | P
2 | F | D | L | M
3 | X | N | R | S
4 | Y | I | W |
5 | U | Z | E |
Tôi muốn bằng cách nào đó tạo ra một GROUP BYnhóm mang lại ba nhóm:
1,2Và3cùng nhau1và2vì một điểm chungDtrongbcột1và3vì một điểm chungXtrongacột
4một mình (không có giá trị chung trong bất kỳ cột nào; null không nên khớp)5một mình (không có giá trị chung trong bất kỳ cột nào; null không nên khớp)
Tôi hiện đang sử dụng Postgres 9.5, nhưng cuối cùng chúng tôi sẽ nâng cấp lên 9.6, vì vậy nếu có bất cứ điều gì trong đó sẽ giúp tôi, tôi sẵn sàng nghe nó.
Nói cách khác, tôi đang tìm kiếm một cái gì đó như (giả sử tôi đã sử dụng array_agg(DISTINCT a), v.v. để giữ cho màn hình đơn giản hơn):
ids | as | bs | cs | ds
-----------------------------------------------------------------------
{1, 2, 3} | {'X', 'F'} | {'D', 'N'} | {'G', 'L', 'R'} | {'P', 'M', 'S'}
{4} | {'Y'} | {'I'} | {'W'} | {NULL}
{5} | {'U'} | {'Z'} | {'E'} | {NULL}
(Tôi không chắc chắn chính xác làm thế nào các null sẽ hiển thị vì vậy đừng quá bận tâm về điều đó; điểm quan trọng là chúng không nên khớp với nhau.)
Khi tôi sử dụng GROUP BY CUBE (a, b, c, d), tôi nhận được nhiều hơn ba kết quả ... ditto GROUP BY ROLLUPvà GROUP BY GROUPING SETS.
Có một cách thanh lịch trong Postgres? Tôi có thể tưởng tượng bạn sẽ làm điều đó như thế nào trong Ruby thông qua Active Record (lặp qua từng bản ghi, nhóm nó với các nhóm được nhóm trước đó phù hợp), nhưng tôi muốn giữ điều này trong Postgres nếu có thể.