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
  

Mensagemem Ter, 02 Jul 2019 4: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:

Código: Selecionar todos
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??
carlynhos77

Mensagemem Ter, 02 Jul 2019 6:05 pm

Mas se tiver 2 proponentes diferentes com o valor máximo.
Qual dos dois você quer que retorne ? Tanto faz?
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Ter, 02 Jul 2019 6:26 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
carlynhos77

Mensagemem Ter, 02 Jul 2019 8:27 pm

Se não interessa qual, basta colocar no FIM da sua query:
Código: Selecionar todos
AND ROWNUM = 1


Ai vai trazer só um, mesmo que tenha N com o máximo valor.
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Ter, 02 Jul 2019 9:00 pm

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

muito obrigado
carlynhos77

Mensagemem Qua, 03 Jul 2019 4:03 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

Código: Selecionar todos
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

Código: Selecionar todos
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

Mensagemem Qua, 03 Jul 2019 4:09 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

Código: Selecionar todos
   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';
carlynhos77

Mensagemem Qua, 03 Jul 2019 4:19 pm

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
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Qua, 03 Jul 2019 7:44 pm

entendido... obrigado
carlynhos77

Mensagemem Qua, 14 Ago 2019 8:49 am

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

Mensagemem Qua, 14 Ago 2019 9:01 am

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:

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
carlynhos77



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes