Tôi có bảng sau:
create table test (
company_id integer not null,
client_id integer not null,
client_status text,
unique (company_id, client_id)
);
insert into test values
(1, 1, 'y'), -- company1
(2, 2, null), -- company2
(3, 3, 'n'), -- company3
(4, 4, 'y'), -- company4
(4, 5, 'n'),
(5, 6, null), -- company5
(5, 7, 'n')
;
Về cơ bản, có 5 công ty khác nhau, mỗi công ty có một hoặc nhiều khách hàng và mỗi khách hàng có trạng thái: 'y' hoặc 'n' (cũng có thể là null).
Điều tôi phải làm là chọn tất cả các cặp (company_id, client_id)
cho tất cả các công ty có ít nhất một khách hàng có trạng thái không phải là 'n' ('y' hoặc null). Vì vậy, đối với dữ liệu mẫu ở trên, đầu ra phải là:
company_id;client_id
1;1
2;2
4;4
4;5
5;6
5;7
Tôi đã thử một cái gì đó với các chức năng của cửa sổ nhưng tôi không thể tìm ra cách so sánh số lượng TẤT CẢ khách hàng với số lượng khách hàng STATUS = 'n'
.
select company_id,
count(*) over (partition by company_id) as all_clients_count
from test
-- where all_clients_count != ... ?
Tôi đã tìm ra cách để làm điều này, nhưng tôi không chắc liệu đó có phải là cách đúng hay không:
select sub.company_id, unnest(sub.client_ids)
from (
select company_id, array_agg(client_id) as client_ids
from test
group by company_id
having count(*) != count( (case when client_status = 'n' then 1 else null end) )
) sub
UNIQUE
bị ràng buộc (company_id, client_id)
trong định nghĩa bảng của bạn. Nhưng dữ liệu thử nghiệm của bạn làm cho nó có vẻ như (company_id, client_id)
là, trên thực tế, là duy nhất. Là nó? Nếu không, bạn có cần * tất cả * hàng đủ điều kiện hoặc mỗi kết hợp company_id
và client_id
chỉ một lần không?