|
|
| Mensagem |
Autor |
| Enviada: Qua, 28 Jul 2010 4:51 pm Assunto: Ajuda |
|
|
Pessoal,
Preciso realizar um select, que atenda mais ou menos as seguinte requisitos.
Possuo a coluna qtd de transações diárias de um estabelecimento, e preciso saber se ele deixou de transacionar por, pelo menos, 4 dias seguidos, ou seja, 4 dias seguidos aonde a qtd de transações é igual a zero.
Qtd = coluna q armazena a quantidade de transações diarias.
Preciso que esse select apenas me traga us estabelecimentos que tenham por quatro dias seguidos NENHUMA transação.
E que eu possa setar o periodo que quero verificar isso.
_________________ Pedro Cestari
|
|
pedrocestari Rank: Estagiário Sênior

Registrado em: Sex, 2 de Julho de 2010 Mensagens: 9 Cidade - UF: Porto Alegre
|
|
|
 |
| Enviada: Qua, 28 Jul 2010 9:24 pm |
|
|
Acho que dá para começar a partir desta consulta:
Obs.: Não estou tratando o caso de um estabelecimento ficar cinco ou mais dias sem realizar uma transação.
Se por exemplo, o estabelecimento 1 não realizou transações entre o dia 01/01 e 06/01, a consulta está retornando os registros:
01/01 (referente a 01/01 até 04/01)
02/01 (referente a 02/01 até 05/01)
03/01 (referente a 03/01 até 06/01)
| Código: |
create table transacoes_diarias
( num_estabelecimento number
, dat_referencia date
, qtd_transacoes number
);
insert into transacoes_diarias
select mod(level, 5) +1 , sysdate - trunc(level/5), trunc(dbms_random.value(0,2))
from dual connect by level <= 9000
;
select num_estabelecimento
, trunc(dat_referencia) dat_referencia
from
(
select a.*
, sum( dias_ate_prx_dt_sem_transacoes )
over(partition by num_estabelecimento
order by dat_referencia
rows between 0 preceding -- somar a diferença de dias sem transações do registro atual
and 3 following -- e dos 3 registros seguintes.
) total_dias -- soma de dias entre duas datas sem transações,agrupadas de 4 em 4 dias
from
(
select num_estabelecimento
, dat_referencia
, linha_desc
, trunc( dat_referencia )
-- dias entre uma data sem transação e a data do registro imediatamente anterior sem transação
- lag( trunc(dat_referencia), 1, trunc( dat_referencia-1 ) )
over( partition by num_estabelecimento
order by dat_referencia
) dias_ate_prx_dt_sem_transacoes
from
(
select t.*
-- ordernamos os registros agrupados por estabelecimento, ordenados em ordem decrescente
-- por data de referência, pois será necessário ignorar os registros referentes
-- aos três ultimos dias (pois ainda não podem estar sem transações há mais de 4 dias)
, row_number() over ( partition by num_estabelecimento order by dat_referencia desc ) linha_desc
from transacoes_diarias t
)
where qtd_transacoes = 0
) a
where linha_desc > 3 -- não considerar os 3 últimos dias de cada estabelecimento
order by num_estabelecimento, dat_referencia
)
where total_dias = 4
;
|
_________________ Rafael O. Genaro
|
|
rogenaro Rank: DBA Júnior

Registrado em: Sex, 30 de Março de 2007 Mensagens: 186 Cidade - UF: Londrina - PR
|
|
|
 |
| Enviada: Qui, 29 Jul 2010 10:35 am |
|
|
Cara,
Value mesmo, fechou certinho, apartir dai, faço mas alguns ajustesm.
Muito obrigado mesmo.
um forte abraço
_________________ Pedro Cestari
|
|
pedrocestari Rank: Estagiário Sênior

Registrado em: Sex, 2 de Julho de 2010 Mensagens: 9 Cidade - UF: Porto Alegre
|
|
|
 |
|
|