Trazer 3 últimos pedidos de cada cliente

SQL

Firebird

09/10/2017

Estou com a seguinte dificuldade em criar uma store procedure:

Cenário: Tenho uma tabela com "n" pedidos de "n" clientes, quero gravar em outra tabela somente o número dos 3 últimos pedidos de cada cliente.

* uso firebird 2.5
Cleibson Oliveira

Cleibson Oliveira

Curtidas 0

Respostas

Luiz Vichiatto

Luiz Vichiatto

09/10/2017

Você pode fazer através de um programa que le os clientes e depois le os pedidos do cliente e faz o insert na tabela que deseja.
   consulta_clientes = select codigo_cliente from clientes 
   while consulta_clientes not eof do 
      consulta_pedidos = select top 3 * from pedido where codigo_cliente=consulta_clientes.codigo_cliente order by data_pedido desc
      insert tabela_nova = consulta_pedidos
   end

A ideia é esta.
GOSTEI 0
Murilo Góis

Murilo Góis

09/10/2017

Estou com a seguinte dificuldade em criar uma store procedure:

Cenário: Tenho uma tabela com "n" pedidos de "n" clientes, quero gravar em outra tabela somente o número dos 3 últimos pedidos de cada cliente.

* uso firebird 2.5


Uma outra solução seria criar uma tabela auxiliar utilizando o row_number com partition e depois fazer um Join selecionando somente o resultado do row_number <=3. Ficaria +- assim:

SELECT * FROM PEDIDO T0
INNER JOIN (SELECT NumPedido, Data,Cliente, ROW_NUMBER() OVER(PARTITION BY Cliente ORDER BY Data DESC) as 'Contador ' from PEDIDO) T1
ON T0.NumPedido = T1.NumPedido and T1.Contador <=3
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

09/10/2017

para ter uma ajuda mais personalizada, quando se tratar de banco de dados, publique ao menos as tabelas e os campos envolvidos.
de qualquer forma, segue um exemplo de como obter os 3 últimos pedidos por cliente:
SELECT
	CLIENTE,
	PED3, PED2, PED1
FROM (
	SELECT
		RANK() OVER (PARTITION BY CLIENTE ORDER BY CLIENTE, PED3 DESC) LINHA,
		CLIENTE,
		PED1, PED2, PED3
	FROM (
		SELECT
			CLIENTE,
			LEAD(NUMPED,2) OVER (PARTITION BY CLIENTE ORDER BY CLIENTE, NUMPED DESC) PED1,
			LEAD(NUMPED,1) OVER (PARTITION BY CLIENTE ORDER BY CLIENTE, NUMPED DESC) PED2,
			NUMPED PED3
		FROM
			PEDIDOS
		WHERE NOT CLIENTE IS NULL
	) T1
) T2
WHERE
	LINHA = 1

GOSTEI 0
POSTAR