PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

MySQL/Postgres odpytuje dane o interwale 5 minut

Rekursywny CTE

Ponieważ każdy wiersz zależy od poprzedniego, trudno jest go rozwiązać za pomocą podejścia opartego na zbiorach. Korzystanie z rekurencyjnego CTE (co jest standardowym SQL):

WITH RECURSIVE cte AS (
   (SELECT ts FROM tbl
    ORDER  BY ts
    LIMIT  1)

   UNION ALL
   (SELECT t.ts
    FROM   cte c
    JOIN   tbl t ON t.ts >= c.ts + interval '5 min'
    ORDER  BY t.ts
    LIMIT  1)
   )
SELECT * FROM cte ORDER BY ts;

Zwróć uwagę na aktualizację z mojego pierwszego szkicu:
Funkcje agregujące nie są dozwolone w rekurencyjnym CTE. Zastąpiłem ORDER BY / LIMIT 1 , który powinien być szybki, gdy jest wspierany przez indeks na ts .

Nawiasy wokół każdej nogi UNION zapytanie jest konieczne, aby zezwolić na LIMIT , co w przeciwnym razie byłoby dozwolone tylko raz na końcu UNION zapytanie.

Funkcja PL/pgSQL

Rozwiązanie proceduralne (przykład z funkcją plpgsql) iterujące po posortowanej tabeli byłoby prawdopodobnie znacznie szybsze, ponieważ może wystarczyć skanowanie pojedynczej tabeli:

CREATE OR REPLACE FUNCTION f_rowgrid(i interval)
  RETURNS SETOF timestamp AS
$func$
DECLARE
   _this  timestamp;
   _last  timestamp := '-infinity';     -- init so that 1 row passes
BEGIN

FOR _this IN
    SELECT ts FROM tbl ORDER BY 1
LOOP
    IF _this >= _last + i THEN
       RETURN NEXT _this;
       _last := _this;
    END IF;
END LOOP;

END
$func$ LANGUAGE plpgsql;

Zadzwoń:

SELECT * FROM  f_rowgrid('5 min')

Skrzypce SQL demonstrując oba.

Oto nieco bardziej złożony przykład tego typu funkcji plpgsql:

Można łatwo uczynić generycznym za pomocą dynamicznego SQL i EXECUTE pracować dla dowolnych tabel.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:Kolumna Uporządkuj według ciągu znaków ze znanymi wartościami

  2. Błąd Postgres SSL SYSCALL:wykryto EOF za pomocą Pythona i psycopg

  3. Za dużo zamówień według maks. podzapytań dla mojego intelektu

  4. Jak znaleźć nazwę ograniczenia w PostgreSQL

  5. WYBIERZ z jednej tabeli, WSTAW do dwóch innych tabel na podstawie warunku