Die Tabelle mit 3 Spalten haben:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Ich möchte alle Zeilen auswählen, die flag = 1
mindestens einmal pro Kategorie haben.
Erwartete Ergebnisse:
ID category flag
1 A 1
2 A 0
3 A 0
Es kann mit einer temporären Tabelle wie folgt gelöst werden:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Aber ich würde eine Lösung mit Gruppierung bevorzugen, die ich nur schwer finden kann. Jede Hilfe wird geschätzt.
quelle
IN
Abfrage. Aber das OP hat " Ich möchte alle Zeilen mit Flag = 1 mindestens einmal pro Kategorie auswählen ", was mich denken lässt, dass dasDISTINCT
in den anderen Abfragen notwendig ist.CROSS APPLY
, dasSELECT DISTINCT category
sollte wohl effizienter sein , wenn mit ersetztSELECT TOP (1) whatever
. Es wäre effektiv eine andere Möglichkeit, eineEXISTS
Unterabfrage zu schreiben .Angenommen, dies
Flag
ist eineBIT
Spalte oder eineINT
, die nur0
und dauert1
als Werte verwendet wird, könnte dies auch mithilfe von Fensterfunktionen erreicht werden. Zum Beispiel:Das ist die Ausgabe:
Dies wird am höchsten finden
Flag
für jede Kategorie in Ihrer Tabelle am In Ihrem Fall ist es wahrscheinlich nur wahr / falsch und wählen Sie eine aus, dietrue(1)
nur hat.Die Konvertierung nach
TINYINT
ist erforderlich, daMAX
keinBIT
Argument akzeptiert wird .quelle