Edição complexa de 'lacunas e ilhas'

Eu tenho uma tabela em um banco de dados Postgres como este:

person    |     eventdate     |  type 
--------------------------------------
<uuid-1>  |   2016-05-14      |   300
<uuid-3>  |   2016-05-14      |   300
<uuid-1>  |   2016-05-15      |   301
<uuid-1>  |   2016-05-16      |   301
<uuid-1>  |   2016-05-18      |   304
<uuid-1>  |   2016-05-22      |   300
<uuid-2>  |   2016-05-22      |   304
<uuid-2>  |   2016-05-27      |   301
<uuid-1>  |   2016-05-30      |   300
<uuid-1>  |   2016-06-01      |   300
<uuid-2>  |   2016-06-15      |   501
<uuid-2>  |   2016-06-16      |   301
<uuid-4>  |   2016-06-16      |   300
<uuid-5>  |   2016-06-20      |   300
<uuid-1>  |   2016-06-21      |   300
<uuid-2>  |   2016-06-21      |   300
<uuid-2>  |   2016-06-23      |   301
<uuid-2>  |   2016-06-30      |   300
<uuid-3>  |   2016-06-30      |   300
<uuid-4>  |   2016-06-30      |   300

A tabela contém entradas de dia não consecutivas para cada dia em que um funcionário está ausente por diferentes razões (tipos) de ausência. No entanto, um período de ausência pode abranger vários desses dias e qualquer entrada de ausência que esteja dentro de 5 dias de uma ausência anterior do mesmo tipo ainda é considerada parte do mesmo 'período' de ausência.

Preciso obter resultados para os períodos de ausência de cada funcionário com a data de início e término desses períodos, mais o número total de dias nesse período de várias datas.

Isso é ainda mais complicado pelo fato de diferentes tipos de ausência serem considerados os mesmos para os fins deste relatório. Portanto, no exemplo acima, o tipo 300, 301, 304 seria tratado como o mesmo.

Então, do meu exemplo acima, o seguinte seria o que eu estou procurando ...

person    |     startdate     |       enddate     |  days   |  type 
--------------------------------------------------------------------
<uuid-1>  |     2016-05-14    |     2016-05-22    |   5     |   300
<uuid-3>  |     2016-05-14    |     2016-04-14    |   1     |   300
<uuid-2>  |     2016-05-22    |     2016-04-27    |   2     |   304
<uuid-1>  |     2016-05-30    |     2016-06-01    |   2     |   300
<uuid-2>  |     2016-06-15    |     2016-06-15    |   1     |   501
<uuid-2>  |     2016-06-16    |     2016-06-16    |   1     |   301
<uuid-4>  |     2016-06-16    |     2016-06-16    |   1     |   300
<uuid-5>  |     2016-06-20    |     2016-06-20    |   1     |   300
<uuid-1>  |     2016-06-21    |     2016-06-21    |   1     |   300
<uuid-2>  |     2016-06-21    |     2016-06-23    |   2     |   300
<uuid-2>  |     2016-06-30    |     2016-06-30    |   1     |   300
<uuid-3>  |     2016-06-30    |     2016-06-30    |   1     |   300
<uuid-4>  |     2016-06-30    |     2016-06-30    |   1     |   300

Como faço para consultar esta tabela para esta saída?

questionAnswers(1)

yourAnswerToTheQuestion