PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Изключете припокриващи се периоди във времевата агрегатна функция

Какво ще кажете за това:

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;
 

За вашите данни ще върне:

<предварителен ┌──────────┐ │ interval │ ├──────────┤ │ 576 days │ └──────────┘ (1 row)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Несъответствие на версията на сървъра на PostgresSQL / pgAdmin4 / dump

  2. Има ли многобайтов Postgresql Levenshtein?

  3. Колко сигурен е format() за динамични заявки във функция?

  4. кръстосана таблица с 2 (или повече) имена на редове

  5. Да се ​​използва ли имейл адресът като основен ключ?