TransWikia.com

Select com re ocorrências de um registro em período

Stack Overflow em Português Asked on September 26, 2021

Preciso saber se um registro ocorreu novamente em um período de 7 dias.
Para isso, conto com uma tabela que salva os registros e a data de ocorrência.
Por exemplo:

Registro: x | Data: 13/03/2017
Registro: y | Data: 14/03/2017
Registro: x | Data: 17/03/2017
Registro: x | Data: 21/03/2017
Registro: z | Data: 31/03/2017

Para isso, o usuário informaria uma data inicial e uma data final, por exemplo:
Registros entre 01/03 e 31/03.

Preciso que o resultado me indique quantas vezes no período o registro se repetiu usando o critério que a diferença em dias de um para o outro deve ser de no máximo 7 dias.
No momento estou usando o seguinte código, que apenas consegue me trazer no período quantas vezes o mesmo registro ocorreu, mas não tem o critério dos 7 dias.

SELECT codigo, data FROM aviso
WHERE data IS NOT NULL
AND data BETWEEN To_Date('01/03/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS') AND To_Date('31/03/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
--HAVING Count(*) > 1
ORDER BY codigo

2 Answers

Creio que o que procura é:

SELECT a.codigo, a.data FROM aviso a
    WHERE a.data IS NOT NULL
    AND a.data BETWEEN To_Date('01/03/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS') AND To_Date('31/03/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
    AND EXISTS (SELECT * FROM aviso b WHERE b.data <= (a.data + 7))
    ORDER BY codigo

Answered by anonimo on September 26, 2021

Não é possível fazer oque está pedindo usando apenas uma consulta simples usando SELECT.

Você precisar mapear todas as regras envolvidas e usar o PL/SQL para extrair apenas os dados que deseja.

Segue abaixo um exemplo com comentários explicativos de como fazer uma extração baseado nas informações que deu:

CREATE GLOBAL TEMPORARY TABLE registros --tabela temporária para adicionar os registros a serem exibidos
   ( registro CHAR(1),
     dtabertura DATE))
   ON COMMIT PRESERVE ROWS;

begin
   Declare Cursor cursorRegs is
           WITH tabela_(registro, data) as ( --tabela criada apenas para montar o exemplo
            select 'x', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'y', to_date('14/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('17/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('21/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('19/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('25/03/2017', 'DD/MM/YYYY') from dual union all
            select 'z', to_date('31/03/2017', 'DD/MM/YYYY') from dual )
            select * from tabela_; --selecionado todos os dados da tabela
   --declare aqui as váriaveis que você for utilizar
   aData DATE;
   oRegistroAtual VARCHAR2(50);
   --Se necessário, adicione outras variáveis aqui

   Begin
     For reg in cursorRegs Loop --Para cada registro selecionado
       --Mapeie toda a lógica envolvida e aqui filtre qual registro deve ou não ser inserido na tabela temporária
       --Exemplo:
       oData := reg.data;
       oRegistroAtual := reg.registro;

       Declare Cursor registrosAdicionar is
            WITH tabela_(registro, data) as (
            select 'x', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'y', to_date('14/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('17/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('21/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('19/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('25/03/2017', 'DD/MM/YYYY') from dual union all
            select 'z', to_date('31/03/2017', 'DD/MM/YYYY') from dual )
            --selecionado apenas os registros que ocorreram entra data e data+7
            select * from tabela_ where registro = oRegistroAtual and data between reg.data and reg.data+7;

        For regAdd in registrosAdicionar Loop
            --aqui será percorrido o segundo cursor adicionando os valores na tabela temporária
            INSERT INTO registros values (regAdd.registro, regAdd.data);
            --Talvez aqui você precise incrementar sua lógica, pois alguns dados serão inserido de forma repetida.
            --Essa tabela é apenas um exemplo, mas no caso real você pode usar a PK da tabela e verificar se esse caso específico já existe na temp table
        End Loop;
     End Loop;   
   End;
end;

Após executar o código faça um select * na tabela temporária:

select * from registros;

Note que não testei esse código. É apenas uma base para você iniciar sua extração.

Durante o desenvolvimento se tiver algum problema específico abra outra pergunta.

Aprenda mais sobre PL/SQL lendo a documentação da Oracle.

Note que o trecho abaixo é apenas para montar uma tabela com alguns registros de exemplo, se quiser poderá alterar isso para melhor adaptar ao caso real, ou utilizar a tabela real.

WITH tabela_(registro, data) as ( 
            select 'x', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'y', to_date('14/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('17/03/2017', 'DD/MM/YYYY') from dual union all
            select 'x', to_date('21/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('13/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('19/03/2017', 'DD/MM/YYYY') from dual union all
            select 'w', to_date('25/03/2017', 'DD/MM/YYYY') from dual union all
            select 'z', to_date('31/03/2017', 'DD/MM/YYYY') from dual )
            select * from tabela_;

Answered by George Wurthmann on September 26, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP