- Este tópico contém 1 resposta, 1 voz e foi atualizado pela última vez 9 anos, 7 meses atrás por Paulo Eduardo Gazola.
-
AutorPosts
-
22 de abril de 2015 às 10:43 pm #107464Paulo Eduardo GazolaParticipante
Olá, pessoal, sou novato no fórum e no Oracle também.
Estou estudando as funções analíticas para tentar resolver meu problema.
Mas, por pura falta de visão, nem sei como buscar no fórum o que preciso.
Por isso peço vossa ajuda.>>>Para cada funcionário público, eu tenho todo o histórico dele (afastamentos, faltas, férias, aumentos de salário, direito a insalubridade, direito a gratificação XYZ, adicional de salário por ter concluído ensino superior, inclusão de um dependente, inclusão em um auxílio saúde, etc. Cada “mudança” na vida do cara está listada como um período de datas INICIO-FIM, algumas sem FIM por serem mudanças permanentes na vida dele. Isto nem é a questão.
Meu problema é que eu preciso recalcular os contracheques dos caras, e assim preciso “cortar” cada mês do ano em pedacinhos, retratando cada MÍNIMA mudança na sua vida.
Exemplo de subset de dados: Fulano da Silva, exclusivamente para o mês de OUTUBRO/2014
– INICIOU e terminou o mês com o salário tabelado A2, de 01 a 31/10/2014.
– TIROU férias de 05 a 13/10/2014.
– (as demais mudanças eu vou ignorar por enquanto, para deixar a coisa o mais simples possível).Este caso, que beira o trivial, quase não tem mudanças no mês do sr. Fulano. Mas é claro que ele corta o mês de out/2014 em três pedaços – minha query explodiu o mês em todos os seus dias:
data ASSUNTO1 VALOR1 ASSUNTO2 VALOR2 (ASSUNTO3, 4, 5... futuramente)
01/10/2014 progressao a2
02/10/2014 progressao a2
03/10/2014 progressao a2
04/10/2014 progressao a2
05/10/2014 progressao a2 ferias ferias
06/10/2014 progressao a2 ferias ferias
07/10/2014 progressao a2 ferias ferias
08/10/2014 progressao a2 ferias ferias
09/10/2014 progressao a2 ferias ferias
10/10/2014 progressao a2 ferias ferias
11/10/2014 progressao a2 ferias ferias
12/10/2014 progressao a2 ferias ferias
13/10/2014 progressao a2 ferias ferias
14/10/2014 progressao a2
15/10/2014 progressao a2
16/10/2014 progressao a2
17/10/2014 progressao a2
18/10/2014 progressao a2
19/10/2014 progressao a2
20/10/2014 progressao a2
21/10/2014 progressao a2
22/10/2014 progressao a2
23/10/2014 progressao a2
24/10/2014 progressao a2
25/10/2014 progressao a2
26/10/2014 progressao a2
27/10/2014 progressao a2
28/10/2014 progressao a2
29/10/2014 progressao a2
30/10/2014 progressao a2
31/10/2014 progressao a2
Meu objetivo é dividir o mês em sub-intervalos, de acordo com cada mudança de assunto.
Em princípio, poderia fazer um GROUP BY valor1, valor2, valor3, … ou seja: para cada possibilidade lógica dos valores, “pega” os dias nesta situação e calcula os períodos como sendo MIN(data) até MAX(data). Mas, esta solução primária não funciona para quando o cara retorna à alguma situação anterior da sua vida. No exemplo, quando o cara volta de férias, a vida dele volta a ser como era antes, MAS COM UM GAP de 08 dias.
Meu objetivo é, em cima dos dados do exemplo, eu obter:
inicio fim assunto1 valor1 assunto2 valor2 (e outros, no futuro)
01/10/2014 04/10/2014 progressao a2
05/10/2014 13/10/2014 progressao a2 ferias ferias
14/10/2014 31/10/2014 progressao a2
Mas o GROUP BY ou o PARTITION BY “juntam” o primeiro com o terceiro período, resultando em:
ERRADO!!!!
inicio fim assunto1 valor1 assunto2 valor2
01/10/2014 31/10/2014 progressao a2
05/10/2014 13/10/2014 progressao a2 ferias ferias
Tentei calcular um sequencial 1, 2 e 3 para os períodos, ou mesmo calcular a coluna MENOR_DATA_DO _PERIODO, mas sem sucesso.
Alguém faz idéia da estratégia que terei que usar para fazer isso?
22 de abril de 2015 às 10:59 pm #107465Paulo Eduardo GazolaParticipanteCOMPLEMENTANDO
O que tentei fazer foi
SELECT (...)
,CASE
-- SEGUNDA LINHA PRA FRENTE: se a data atual for a anterior+1, estamos ainda dentro de um período contínuo!
WHEN (to_date(data)-1 = LAG(data, 1, data)OVER(PARTITION BY valor1,valor2 ORDER BY data))
THEN LAG(menor_data_do_bloco, 1)OVER(PARTITION BY valor1,valor2 ORDER BY data)
-- PRIMEIRA LINHA DE UM PERÍODO: a data atual inicia um novo período contínuo (no exemplo, entraria no ELSE nos dias 01/10 e no 14/10)
ELSE data
END menor_data_do_bloco
Mas, o Oracle dá erro pois estou usando uma definição recursiva para menor_data_do_bloco (erro: identificador inválido).
-
AutorPosts
- Você deve fazer login para responder a este tópico.