Complex 'Gaps and Islands' Ausgabe

Ich habe eine Tabelle in einer Postgres-Datenbank wie folgt:

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

Die Tabelle enthält nicht aufeinanderfolgende Tageseinträge für jeden Tag, an dem ein Mitarbeiter aus verschiedenen Gründen (Arten) abwesend ist. Ein Abwesenheitszeitraum kann sich jedoch über mehrere dieser Tage erstrecken, und jede Abwesenheitserfassung, die innerhalb von fünf Tagen nach einer früheren Abwesenheit desselben Typs erfolgt, wird weiterhin als Teil desselben Abwesenheitszeitraums betrachtet.

Ich muss für jeden Mitarbeiter Abwesenheitsperioden mit Start- und Enddatum dieser Perioden sowie der Gesamtzahl der Tage innerhalb dieses Zeitraums mit mehreren Datumsbereichen ausgeben.

Dies wird durch die Tatsache weiter erschwert, dass verschiedene Arten von Abwesenheit für den Zweck dieses Berichts als gleich angesehen werden. In dem obigen Beispiel würde also Typ 300, 301, 304 als dasselbe behandelt.

So aus meinem obigen Beispiel wäre das, wonach ich strebe ...

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

Wie frage ich diese Tabelle für diese Ausgabe ab?