FAQ Procura Membros Registre-se Perfil MP's Login/Out
Ajuda

 
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> SQL
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
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
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
Rank: Estagiário Sênior


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


Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    glufke.net - Índice do Fórum -> SQL Todos os horários são GMT - 3 Hours
Página 1 de 1

 
 
. .