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