Trazer 3 últimos pedidos de cada cliente
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
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
Curtidas 0
Respostas
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.
A ideia é esta.
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
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
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
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:
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