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

Responder a