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 = 1al 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

INconsulta. 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 queDISTINCTes necesario en las otras consultas.CROSS APPLY,SELECT DISTINCT categoryprobablemente debería ser más eficiente si se reemplaza conSELECT TOP (1) whatever. Efectivamente sería otra forma de escribir unaEXISTSsubconsulta.Suponiendo que
Flages unaBITcolumna o unaINTque solo toma0y1como valores, esto también podría lograrse utilizando funciones de ventana. Por ejemplo:Esa es la salida:
Esto encontrará el más alto
Flagpara 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
TINYINTes necesaria porqueMAXno acepta unBITargumento.fuente