Ich habe folgende Tabelle:
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')
;
Grundsätzlich gibt es 5 verschiedene Unternehmen, jedes hat einen oder mehrere Kunden und jeder Kunde hat den Status: 'y' oder 'n' (kann auch null sein).
Was ich tun muss, ist, alle Paare (company_id, client_id)für alle Unternehmen auszuwählen , für die es mindestens einen Kunden gibt, dessen Status nicht 'n' ('y' oder null) ist. Für die obigen Beispieldaten sollte die Ausgabe also sein:
company_id;client_id
1;1
2;2
4;4
4;5
5;6
5;7
Ich habe etwas mit Fensterfunktionen versucht, kann aber nicht herausfinden, wie die Anzahl ALLER Clients mit der Anzahl der Clients verglichen werden kann STATUS = 'n'.
select company_id,
count(*) over (partition by company_id) as all_clients_count
from test
-- where all_clients_count != ... ?
Ich habe herausgefunden, wie das geht, bin mir aber nicht sicher, ob es der richtige Weg ist:
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
UNIQUEeingeschränkt (company_id, client_id). Ihre Testdaten lassen jedoch den Eindruck entstehen (company_id, client_id), dass sie tatsächlich einzigartig sind. Ist es? Wenn nicht, benötigen Sie * alle * qualifizierenden Zeilen oder jede Kombination von company_idund client_idnur einmal ?