sql >> Database teknologi >  >> RDS >> PostgreSQL

Kompleks 'Gaps and Islands'-spørgsmål

Det er uklart, hvordan du bestemmer type for hver periode. Jeg valgte minimumsantallet.

Forudsat denne grundlæggende tabeldefinition:

CREATE TABLE tbl (person text, eventdate date, type int);
 

Grundlæggende foreslår jeg vinduefunktioner i to indlejrede underforespørgsler for at identificere medlemmer af samme periode (ø). Saml derefter:

SELECT person, period
     , min(eventdate) AS startdate
     , max(eventdate) AS enddate
     , count(*)       AS days
     , min(type)      AS type
FROM  (
   SELECT person, eventdate, type
        , count(gap) OVER (PARTITION BY person ORDER BY eventdate) AS period
   FROM  (
      SELECT person, eventdate, type
           , CASE WHEN lag(eventdate) OVER (PARTITION BY person ORDER BY eventdate)
                     > eventdate - 6  -- within 5 days
                  THEN NULL           -- same period
                  ELSE TRUE           -- next period
             END AS gap
      FROM   tbl
      ) sub
   ) sub
GROUP  BY person, period
ORDER  BY person, period;
 

Resultat (baseret på dine eksempeldata):

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

Hvis den samme dag for den samme person kan indtastes flere gange med forskellige typer, og du kun ønsker at tælle adskilte dage, lav det:count(DISTINCT eventdate) AS days .

Relateret, med detaljeret forklaring:

BTW, eventdate - 6 virker for datatypen date , men ikke for timestamp :




  1. Er der et godt alternativ til SQL*PLUS til Oracle?

  2. Hvordan håndterer du ', enkelt citat i personnavne i php, javascript

  3. Tilslutning af MySQL fra JSP

  4. slet ved hjælp af hvor og eller