No Sqlite 3, estou tentando descobrir como selecionar linhas com base em um valor mínimo. Eu acho que estou limitado por não conhecer o suficiente da terminologia relacionada para pesquisar efetivamente no Google.
A tabela se parece com:
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 a 3
1 b 4
Eu quero obter as linhas onde num2
está 1, 2
, e 4
. Quero fazer a seleção com base no valor mínimo de num para cada valor exclusivo da coluna de texto.
Então, para text = 'a'
, o valor mínimo de num
é 0
, então eu quero as linhas 1 e 2. Para text = 'b'
, o valor mínimo de num
é 1
, então eu quero a linha 4
.
Usando várias combinações de agrupar por, eu sou capaz de obter linhas 1
e / 2
ou linhas 1
e 4
. Sinto que estou sentindo falta de um componente SQL que faria o que eu quero, mas não consegui descobrir o que poderia ser.
Qual é a maneira correta de fazer esse tipo de consulta?
Solução possível
Eu encontrei uma maneira de fazer isso. Não tenho reputação suficiente para responder à minha própria pergunta, por isso estou fazendo a atualização aqui. Não tenho certeza se está sempre correto ou como é a eficiência. Quaisquer comentários são bem-vindos.
Eu usei uma instrução de seleção composta, em que uma consulta encontra o valor mínimo de num para cada valor exclusivo do texto:
sqlite> select num, text from t group by text having num = min( num );
num text
---------- ----------
0 a
1 b
Então juntei isso à tabela completa para obter todas as linhas correspondentes a essas duas colunas.
sqlite> with u as
( select num, text from t group by text having num = min( num ) )
select t.* from t join u on t.num = u.num and t.text = u.text;
num text num2
---------- ---------- ----------
0 a 1
0 a 2
1 b 4
u
consulta é armazenado em uma tabela temporária, independentemente de ser gravada como uma CTE, uma exibição ou embutida como uma subconsulta.Eu costumo fazer esse tipo de coisa com uma junção externa:
Isso é basicamente dizer; me dê todos os registros que não têm um valor maior, isto é, nulo.
fonte
Então, como você pode encontrar a resposta para sua pergunta da próxima vez? Na minha opinião, é decompondo e seguindo a lógica. E você acertou:
Isso se traduz em:
(Isso deve ser equivalente à sua
having
consulta. Pode ser interessante dar uma olhada nas linhas ondenum
é igual a NULL. O mais preciso: veja qual é o efeito das linhas com nulos, que você pode filtrar primeiro com awhere num is not null
)A partir daqui, você pode alcançar o resultado desejado:
Ou usando uma junção:
E quando o desempenho não for suficiente para suas tabelas, comece a analisar declarações mais complexas.
fonte
Essa consulta não deve ser exatamente o que você precisa?
fonte
num2
valores são únicos.