Tendo a tabela com 3 colunas:
ID category flag
1 A 1
2 A 0
3 A 0
4 B 0
5 C 0
Quero selecionar todas as linhas que tenham flag = 1
pelo menos uma vez por categoria.
Resultados esperados:
ID category flag
1 A 1
2 A 0
3 A 0
Pode ser resolvido usando uma tabela temporária como esta:
select ID into #tempTable from someTable where flag = 1
select * from someTable join #tempTable on someTable.ID = #tempTable.ID
Mas eu prefiro uma solução com o agrupamento, que luto para encontrar. Qualquer ajuda será apreciada.
sql-server
group-by
Piotr Falkowski
fonte
fonte
IN
consulta. Mas o OP tem " Desejo selecionar todas as linhas que possuem sinalizador = 1 pelo menos uma vez por categoria ", o que me faz pensar que issoDISTINCT
é necessário nas outras consultas.CROSS APPLY
,SELECT DISTINCT category
provavelmente deve ser mais eficiente se substituído porSELECT TOP (1) whatever
. Seria efetivamente outra maneira de escrever umaEXISTS
subconsulta.Supondo que
Flag
seja umaBIT
coluna ou umaINT
que use apenas0
e1
como valores, isso também pode ser alcançado usando funções em janelas. Por exemplo:Essa é a saída:
Isso será mais alto
Flag
para cada categoria na sua tabela; no seu caso, provavelmente é apenas verdadeiro / falso e escolha alguém que tenhatrue(1)
apenas.A conversão para
TINYINT
é necessária porqueMAX
não aceita umBIT
argumento.fonte