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 BY
nhóm mang lại ba nhóm:
1
,2
Và3
cùng nhau1
và2
vì một điểm chungD
trongb
cột1
và3
vì một điểm chungX
tronga
cột
4
một mình (không có giá trị chung trong bất kỳ cột nào; null không nên khớp)5
mộ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 ROLLUP
và 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ể.