Tener la mesa con 3 columnas:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Quiero seleccionar todas las filas que tienen flag = 1
al menos una vez por categoría.
Resultados previstos:
ID category flag
1 A 1
2 A 0
3 A 0
Se puede resolver usando una tabla temporal como esta:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Pero preferiría una solución con la agrupación, que me cuesta encontrar. Cualquier ayuda será apreciada.
sql-server
group-by
Piotr Falkowski
fuente
fuente
IN
consulta. Pero el OP tiene " Quiero seleccionar todas las filas que tienen flag = 1 al menos una vez por categoría ", lo que me hace pensar queDISTINCT
es necesario en las otras consultas.CROSS APPLY
,SELECT DISTINCT category
probablemente debería ser más eficiente si se reemplaza conSELECT TOP (1) whatever
. Efectivamente sería otra forma de escribir unaEXISTS
subconsulta.Suponiendo que
Flag
es unaBIT
columna o unaINT
que solo toma0
y1
como valores, esto también podría lograrse utilizando funciones de ventana. Por ejemplo:Esa es la salida:
Esto encontrará el más alto
Flag
para cada categoría en su tabla, en su caso es probable que solo sea verdadero / falso y elija uno quetrue(1)
solo tenga .La conversión a
TINYINT
es necesaria porqueMAX
no acepta unBIT
argumento.fuente