2017-04-20 4 views
0

Ich muss alle Zeilen finden, die Teil einer Gruppe sind, die bestimmte Bedingungen erfüllt.Wie überprüft man, ob mindestens eine einer Gruppe von Zeilen einen bestimmten Wert hat

Ich definiere eine Gruppe als mehrere Zeilen, die einen Wert in der Gruppe Spalte teilen.
Eine relevante Gruppe muss mindestens eine Zeile mit "Eligible" auf "True" und mindestens zwei der Zeilen in der Gruppe müssen sich in einer anderen Spalte als "Group" oder "Eligible" voneinander unterscheiden.

Beispiel Tabelle

Group LastName FirstName Eligible 
========================================== 
1  Smith  John   True 
1  Smith  John   False 
2  Doe   Beth   True 
2  Doe   Jane   False 
2  Doe   Jane   False 
3  Ward  Bill   True 
4  Adams  Sally   True 
4  Grimes  Sally   True 

Gewünschtes Ergebnis

Group LastName FirstName Eligible 
========================================== 
2  Doe   Beth   True 
2  Doe   Jane   False 
2  Doe   Jane   False 
4  Adams  Sally   True 
4  Grimes  Sally   True 

Die folgende Abfrage wird mich nahe

SELECT * 
FROM ExampleTable 
WHERE Group in 
    (SELECT Group 
    FROM ExampleTable 
    GROUP BY Group 
    HAVING count(distinct LastName) > 1 or count(distinct FirstName) > 1) 

Das Problem ist, dass es zu viele Ergebnisse ist die Rückkehr, weil es nicht in Betracht zu ziehen ist ob einer der Datensätze in der Gruppe als berechtigt markiert ist.

Ich vermisse wahrscheinlich etwas Einfaches, aber ich kann nicht herausfinden, wie überprüft werden kann, ob ein Datensatz in der Gruppe Eligible auf true gesetzt ist, ohne zu prüfen, ob alle auf true gesetzt sind.

Antwort

1

Fügen Sie eine weitere Bedingung hinzu, die überprüft, ob die Gruppe mindestens einen zulässigen = True-Wert hat.

SELECT * 
FROM ExampleTable 
WHERE Group in 
    (SELECT Group 
    FROM ExampleTable 
    GROUP BY Group 
    HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1) 
    and count(case when eligible='True' then 1 end) >= 1 
    ) 
1

können Sie die Gruppen identifizieren mit Aggregationslogik:

SELECT Group 
FROM ExampleTable 
GROUP BY Group 
HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)) AND 
     MAX(eligible) = 'True'; 

Hinweis: Dies setzt voraus, eligible eine Zeichenfolge ist. Die Logik für "In Frage kommen" könnte je nach Typ und Datenbank auf andere Weise implementiert werden.

Dann die Abfrage ist im Grunde gibt:

SELECT et.* 
FROM ExampleTable et 
WHERE et.Group IN (SELECT Group 
        FROM ExampleTable 
        GROUP BY Group 
        HAVING (count(distinct LastName) > 1 or count(distinct FirstName) > 1)) AND 
          MAX(eligible) = 'True' 
       ); 
Verwandte Themen