Avoir la table à 3 colonnes:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Je veux sélectionner toutes les lignes qui ont flag = 1
au moins une fois par catégorie.
Résultats attendus:
ID category flag
1 A 1
2 A 0
3 A 0
Il peut être résolu en utilisant une table temporaire comme celle-ci:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Mais je préférerais une solution avec le regroupement, que j'ai du mal à trouver. Toute aide serait appréciée.
sql-server
group-by
Piotr Falkowski
la source
la source
IN
requête. Mais l'OP a " Je veux sélectionner toutes les lignes qui ont flag = 1 au moins une fois par catégorie ", ce qui me fait penser queDISTINCT
c'est nécessaire dans les autres requêtes.CROSS APPLY
, leSELECT DISTINCT category
devrait probablement être plus efficace s'il est remplacé parSELECT TOP (1) whatever
. Ce serait effectivement une autre façon d'écrire uneEXISTS
sous-requête.En supposant qu'il
Flag
s'agit d'uneBIT
colonne ou d'une colonneINT
qui prend uniquement0
et en1
tant que valeurs, cela peut également être réalisé à l'aide de fonctions fenêtrées. Par exemple:Voilà la sortie:
Cela trouvera le plus élevé
Flag
pour chaque catégorie de votre tableau, dans votre cas, c'est probablement vrai / faux seulement et choisissez celui qui atrue(1)
seulement.La conversion en
TINYINT
est nécessaire carMAX
n'accepte pas d'BIT
argument.la source