Pular para o conteúdo
  • Este tópico contém 1 resposta, 1 voz e foi atualizado pela última vez 9 anos, 7 meses atrás por Avatar de Paulo Eduardo GazolaPaulo Eduardo Gazola.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #107464
    Avatar de Paulo Eduardo GazolaPaulo Eduardo Gazola
    Participante

      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?

      #107465
      Avatar de Paulo Eduardo GazolaPaulo Eduardo Gazola
      Participante

        COMPLEMENTANDO

        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).

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress