Buscar o registro com o maior valor

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, boa tarde

Montei um SELECT com a intenção de buscar na tabela o registro que possua o MAIOR valor de lance, vejam:

Selecionar tudo

select CODIGO_PROPONENTE 
      INTO :P27_COD_PROPONENTE
      from LIC_LICITACAO_ITENS_PREGAO
      where VALOR_LANCE = (SELECT MAX(VALOR_LANCE) FROM LIC_LICITACAO_ITENS_PREGAO
                          where 
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1'
                          ) AND 
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1';
Indepente de quantos registros sejam selecionados pelos critérios, quero somente o q tenha o MAIOR VALOR

Porém, acredito q ta meio gambiarra isso, pois quando tem 2 registros com o mesmo valor, já da erro... percebo tambem que as vezes o codigo falha em buscar

Nesse sentido ai, alguém tem uma dica que realmente resolva isso??
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Mas se tiver 2 proponentes diferentes com o valor máximo.
Qual dos dois você quer que retorne ? Tanto faz?
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

então, por exemplo se 3 derem lances iguais, eu preciso iniciar com 1... talvez pega o primeira em ordem alfabetica, ou pegar o primeiro com o ID menor

Eu preciso pegar so um registro, desde q seja o maior valor
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Se não interessa qual, basta colocar no FIM da sua query:

Selecionar tudo

AND ROWNUM = 1
Ai vai trazer só um, mesmo que tenha N com o máximo valor.
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

nossa, um pedacinho do codigo tão simples kkkkkkkk... funcionou certinho

muito obrigado
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

ola, boa tarde...

Na mesma ideia aqui, porém, quero pegar o menor valor... esse código abaixo utilizo pra pegar o MAIOR VALOR e funciona certinho

Selecionar tudo

select (to_char(VALOR_LANCE, 'FM999G999G999D90') - 0.01)   
      INTO :P27_VALOR_LANCE
      from LIC_LICITACAO_ITENS_PREGAO
      where VALOR_LANCE = (SELECT MAX(VALOR_LANCE) FROM LIC_LICITACAO_ITENS_PREGAO
                          where 
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1') and
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1'; 

mas esse mesmo código abaixo, eu to tentando utilizar o MIN q deveria funcionar... porém não pega o menor valor

Selecionar tudo

select (to_char(VALOR_LANCE, 'FM999G999G999D90') - 0.01)   
      INTO :P27_VALOR_LANCE
      from LIC_LICITACAO_ITENS_PREGAO
      where VALOR_LANCE = (SELECT [color=#0000FF]MIN(VALOR_LANCE)[/color] FROM LIC_LICITACAO_ITENS_PREGAO
                          where 
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1') and
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1'; 
pelo q pesquisei, esse MIN era pra resolver o problema, tem algum detalhe q não estou percebendo
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

acho q achei o ponto q faltava, so puderem so confirmar se é isso... aqui funcionou

coloquei o Min no inicio também, dai funcionou

Selecionar tudo

   select  Min(to_char(VALOR_LANCE, 'FM999G999G999D90'))  
      INTO :P27_VALOR_LANCE
      from LIC_LICITACAO_ITENS_PREGAO
      where VALOR_LANCE = (SELECT MIN(VALOR_LANCE) FROM LIC_LICITACAO_ITENS_PREGAO
                          where 
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1') and
                          CODIGO_LICITACAO = :G_NR_LICITACAO and
                          ID_CIDADE = :G_ID_CIDADE and
                          LOTE = :P27_GUARDA_LOTE and
                          CODIGO_ITEM = :P27_GUARDA_CODIGO_ITEM and
                          MOSTRAR_TELA_LANCE = '1';
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Ainda não li sua resposta...
Quando for adicionar um código, use as tags [code].

Exemplo:

[code] SELECT BLABLABLAB [/code]

Se esquecer disso, leia aqui:
[attachment=0]Screen Shot 2019-07-03 at 12.16.07 PM.png[/attachment]
Anexos
Screen Shot 2019-07-03 at 12.16.07 PM.png
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

entendido... obrigado
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Ola, bom dia

Retornando a esse problema, onde preciso pegar somente o registro com o MAIOR VALOR, estava com problemas quando existir 2 valores maiores iguais ne, dai você me disse para colocar no final da query ( AND ROWNUM = 1 )

Porém, percebi que, se o valor for:

109 e outro 109,05 (a query não considera que o valor de 109,05 seja maior), parece q desconsidera o centavos

Agora, se eu não utilizar o termo ( AND ROWNUM = 1 ), o query consegue enxergar o valor de 109,05 sendo o maior, porem, se houver no grupo consultado, dois valores igual de proposta, dá o o erro:

A chamada do Ajax retornou o erro de servidor ORA-01422: a extração exata retorna mais do que o número solicitado de linhas para Executar Código PL/SQL.
carlynhos77
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 172
Registrado em: Seg, 24 Out 2016 7:20 pm

Achei o problema, na verdade eu estava utilizando o termo ( AND ROWNUM = 1 ) nos 2 selects... verifiquei que preciso utilizar o termo no meu select principal, conforme exemplo abaixo:

Selecionar tudo

SELECT * FROM (SELECT * FROM T_DEVEDORESCREDIT ORDER BY VALORATUAL DESC)
WHERE ROWNUM = 1;
Não utilizei no meu sub-select.

Caso alguém tenha uma observação sobre isso, por favor me passe... até o momento resolveu pra mim

obrigado
Responder
  • Informação