2015-02-02 9:14 GMT-02:00 Zan <[email protected]>:
> Preciso fazer uma consulta que traga dois campos com o período em que o
> funcionário ficou afastado.
> O primeiro registro encontrado seria o campo 1 e o registro seguinte
> (volta) o campo 2. As próximas ocorrências voltaria a ser 1 e 2 na
> sequência.
>
> Tenho os seguintes registros.
>
> Código Data
> 1 01/01/2014
> 2 01/02/2014
> 1 01/02/2014
> 1 01/03/2014
>
> Preciso ter o seguinte resultado:
>
> Código DataSaida DataRetorno
> 1 01/01/2014 01/02/2014
> 1 01/03/2014
> 2 01/02/2014
>
> Como posso fazer essa consulta?
>
Isto está chorando por uso de WINDOW FUNCTIONS... Veja em [1] e [2] para
mais detalhes.
Eu faria algo do tipo:
SELECT codigo, data_saida, data_retorno
FROM (
SELECT codigo,
data AS data_saida,
lead(data) OVER(PARTITION BY codigo ORDER BY data) AS
data_retorno,
row_number() OVER(PARTITION BY codigo ORDER BY data) AS rn
FROM sua_tabela
) t
WHERE t.rn % 2 = 1
ORDER BY codigo, data_saida;
A ideia é usar a função "lead" para recuperar a próxima data partindo da
atual, depois filtrar a "row_number" para pegar apenas os números
ímpares (t.rn%2
= 1), o que significa que é um registro de saída.
De qualquer forma recomendo você mudar seu modelo para ao menos registrar o
que é entrada e o que é saída, desta forma me parece um pouco fraco/frágil.
Sem mais detalhes é difícil dizer, mas me parece que a melhor escolha seria
exatamente como o resultado da consulta, uma tabela com as duas datas,
deixando a data de retorno como NULL quando o funcionário ainda não
retornou.
[1] http://www.dextra.com.br/window-functions-no-postgresql-parte1/
[2] http://www.dextra.com.br/window-functions-no-postgresql-parte-2/
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral