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
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP