Posiadanie tabeli z 3 kolumnami:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Chcę wybrać wszystkie wiersze, które mają flag = 1
co najmniej raz na kategorię.
Oczekiwane rezultaty:
ID category flag
1 A 1
2 A 0
3 A 0
Można go rozwiązać za pomocą tabeli tymczasowej takiej jak ta:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Ale wolałbym rozwiązanie z grupowaniem, z którym mam problem. Każda pomoc będzie mile widziana.
sql-server
group-by
Piotr Falkowski
źródło
źródło
IN
zapytanie. Ale OP ma „ Chcę wybrać wszystkie wiersze, które mają flagę = 1 przynajmniej raz na kategorię ”, co sprawia, że uważam, żeDISTINCT
jest to konieczne w innych zapytaniach.CROSS APPLY
,SELECT DISTINCT category
prawdopodobnie powinien być bardziej wydajny, jeśli zostanie zastąpionySELECT TOP (1) whatever
. Byłby to skutecznie inny sposób napisaniaEXISTS
podzapytania.Zakładając, że
Flag
jest toBIT
kolumna lub kolumna,INT
która przyjmuje tylko0
i1
jako wartości, można to osiągnąć również za pomocą funkcji okienkowych. Na przykład:To jest wynik:
To będzie najwyższe
Flag
dla każdej kategorii w twojej tabeli, w twoim przypadku jest to prawdopodobnie tylko prawda / fałsz i wybierz tę, która matrue(1)
tylko.Konwersja na
TINYINT
jest potrzebna, ponieważMAX
nie przyjmujeBIT
argumentu.źródło