sql >> Databáze >  >> RDS >> PostgreSQL

Vyloučit překrývající se období ve funkci časové agregace

Co s tím:

WITH
   /* get all time points where something changes */
   points AS (
       SELECT "startDate" AS p
       FROM temp_period
       UNION SELECT "endDate"
       FROM temp_period
   ),
   /*
    * Get all date ranges between these time points.
    * The first time range will start with NULL,
    * but that will be excluded in the next CTE anyway.
    */
   inter AS (
      SELECT daterange(
                lag(p) OVER (ORDER BY p),
                p
             ) i
      FROM points
   ),
   /*
    * Get all date ranges that are contained
    * in at least one of the intervals.
    */
   overlap AS (
      SELECT DISTINCT i
      FROM inter
         CROSS JOIN temp_period
      WHERE i <@ daterange("startDate", "endDate")
   )
/* sum the lengths of the date ranges */
SELECT sum(age(upper(i), lower(i)))
FROM overlap;

Pro vaše data se vrátí:

┌──────────┐
│ interval │
├──────────┤
│ 576 days │
└──────────┘
(1 row)


  1. MySQL pořadí podle dvou hodnot

  2. Co je STATISTICKÝ PROFIL na serveru SQL Server?

  3. 4 způsoby, jak zkontrolovat, zda tabulka existuje před jejím umístěním na SQL Server (T-SQL)

  4. Vytvoření CakePHP REST api ze stávajícího projektu