Firebird SQL - Retornar o Maior Valor de Datas e Turno de coluna dDiferente

10/02/2021

15

Olá pessoal, boa tarde.
Me desculpem desde já se talvez não seja o local mais adequado para postar esta minha dúvida, mas confesso que sou bem leigo no assunto, mas sempre que posso vejo os posts do pessoal aqui no devmedia. Preciso de uma ajuda, que está me matando, e espero que possam me auxiliar.
É até boba a pergunta mas, seria muito grato em ser ajudado.

Vamos lá.

Tenho uma simples tabela SQL que com um select me retornam 03 campos: preço de venda, data do movimento e turno da ocorrência.
Preciso que sejam gerados sempre no Select os 03 últimos valores para as colunas citadas, sendo sempre o preço de venda, através da maior data cadastrada e do maior turno, com algumas condições.

Até então eu utilizava:

SELECT  FIRST 3 PRC_VEN_VISTA, MAX(DAT_MOVIMENTO), MAX(TURNO_ID)
FROM PRECO_PRODUTO
WHERE EMPRESA_ID=7783
AND PRODUTO_ID=105 
AND DAT_MOVIMENTO between ''''11.01.2021'''' and ''''09.02.2021'''') // utilizo para me puxar os 30 dias anteriores os valores do combustível de id setada
GROUP BY TURNO_ID, DAT_MOVIMENTO, PRC_VEN_VISTA
ORDER BY DAT_MOVIMENTO DESC


Exemplo de tabela:

PRC_VEN_VISTA MAX MAX2
4,64 09/02/2021 01
4,79 09/02/2021 02
4,20 04/02/2021 01
4,81 30/01/2021 01
4,19 25/01/2021 02
4,05 24/01/2021 01

Consulta da Tabela:

PRC_VEN_VISTA MAX MAX2
4,64 09/02/2021 01
4,79 09/02/2021 02
4,20 04/02/2021 01

Meu SQL retona o maior valor de data, porém quando ocorre igual o caso acima, de duas datas iguais, eu gostaria que ele me retornasse o maior valor de data + maior valor do Turno.

Expectativa : 4,79 - 09/02/2021 - 02

PRC_VEN_VISTA MAX MAX2
4,79 09/02/2021 02
4,64 09/02/2021 01
4,20 04/02/2021 01

OBS: coloquei First 3, somente para acompanhamento, porém eu preciso somente que o resultado da minha tabela se ORDENE da MAIOR data e Turno Correspondente caso sejam datas repetidas.

Este caso funciona somente para datas distintas.

Poderiam me ajudar?
Responder

Post mais votado

10/02/2021

faltou a data no filtro....
SELECT
    PP.EMPRESA_ID, PP.PRODUTO_ID, PP.DAT_MOVIMENTO, PP.TURNO_ID, PP.PRC_VEN_VISTA
FROM
    PRECO_PRODUTO PP
INNER JOIN
(
    SELECT EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO, MAX(TURNO_ID) TURNO_ID
    FROM PRECO_PRODUTO
    WHERE EMPRESA_ID = 7783
    AND PRODUTO_ID = 105
    AND DAT_MOVIMENTO between '11.01.2021' and '09.02.2021'
    GROUP BY EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO
) FILTRO ON FILTRO.EMPRESA_ID = PP.EMPRESA_ID AND FILTRO.PRODUTO_ID = PP.PRODUTO_ID AND FILTRO.TURNO_ID = PP.TURNO_ID
AND FILTRO.DAT_MOVIMENTO = PP.DAT_MOVIMENTO -- FALTOU ESTA CONDIÇÃO NO RELACIONAMENTO
ORDER BY
    PP.DAT_MOVIMENTO DESC
Responder

Mais Posts

deve ser algo assim:
SELECT
	PP.EMPRESA_ID, PP.PRODUTO_ID, PP.DAT_MOVIMENTO, PP.TURNO_ID, PP.PRC_VEN_VISTA
FROM
	PRECO_PRODUTO PP
INNER JOIN
(
	SELECT EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO, MAX(TURNO_ID) TURNO_ID
	FROM PRECO_PRODUTO
	WHERE EMPRESA_ID = 7783
	AND PRODUTO_ID = 105
	AND DAT_MOVIMENTO between '11.01.2021' and '09.02.2021'
	GROUP BY EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO
) FILTRO ON FILTRO.EMPRESA_ID = PP.EMPRESA_ID AND FILTRO.PRODUTO_ID = PP.PRODUTO_ID AND FILTRO.TURNO_ID = PP.TURNO_ID
ORDER BY
	PP.DAT_MOVIMENTO DESC

Responder

10/02/2021

Eli Dias

deve ser algo assim:
SELECT
	PP.EMPRESA_ID, PP.PRODUTO_ID, PP.DAT_MOVIMENTO, PP.TURNO_ID, PP.PRC_VEN_VISTA
FROM
	PRECO_PRODUTO PP
INNER JOIN
(
	SELECT EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO, MAX(TURNO_ID) TURNO_ID
	FROM PRECO_PRODUTO
	WHERE EMPRESA_ID = 7783
	AND PRODUTO_ID = 105
	AND DAT_MOVIMENTO between '11.01.2021' and '09.02.2021'
	GROUP BY EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO
) FILTRO ON FILTRO.EMPRESA_ID = PP.EMPRESA_ID AND FILTRO.PRODUTO_ID = PP.PRODUTO_ID AND FILTRO.TURNO_ID = PP.TURNO_ID
ORDER BY
	PP.DAT_MOVIMENTO DESC




Dede já muito obrigado pela ajuda.
Mas ainda assim, o resultado sai todos resultados de 09/02/2021, com valor de 4,64 e 4,74.

O que preciso é que saísse somente 4,74 de 09/02/2021.
Responder

10/02/2021

Eli Dias

faltou a data no filtro....
SELECT
    PP.EMPRESA_ID, PP.PRODUTO_ID, PP.DAT_MOVIMENTO, PP.TURNO_ID, PP.PRC_VEN_VISTA
FROM
    PRECO_PRODUTO PP
INNER JOIN
(
    SELECT EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO, MAX(TURNO_ID) TURNO_ID
    FROM PRECO_PRODUTO
    WHERE EMPRESA_ID = 7783
    AND PRODUTO_ID = 105
    AND DAT_MOVIMENTO between '11.01.2021' and '09.02.2021'
    GROUP BY EMPRESA_ID, PRODUTO_ID, DAT_MOVIMENTO
) FILTRO ON FILTRO.EMPRESA_ID = PP.EMPRESA_ID AND FILTRO.PRODUTO_ID = PP.PRODUTO_ID AND FILTRO.TURNO_ID = PP.TURNO_ID
AND FILTRO.DAT_MOVIMENTO = PP.DAT_MOVIMENTO -- FALTOU ESTA CONDIÇÃO NO RELACIONAMENTO
ORDER BY
    PP.DAT_MOVIMENTO DESC



Rapaz, você é fantástico. Exatamente o que eu precisava.
Imensamente agradecido.

Agora me retornam os maiores entre datas se repetidas, com maior Turno igualmente.

Parabéns e muito Obrigado novamente.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar