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

Jak oznaczyć grupy w postgresql, gdy przynależność do grupy zależy od poprzedniego wiersza?

„wybór w ramach wyboru” częściej nazywa się „podwybór” lub „podzapytanie” W Twoim konkretnym przypadku jest to skorelowane podzapytanie . LATERAL złączenia (nowość w postgresie 9.3) mogą w dużej mierze zastąpić skorelowane podzapytania bardziej elastycznymi rozwiązaniami:

Myślę, że nie potrzebujesz tutaj.

Dla Twojego pierwszego przypadku to zapytanie jest jednak prawdopodobnie szybsze i prostsze:

SELECT date, max(value) OVER (PARTITION BY grp) AS value
FROM  (
   SELECT *, count(value) OVER (ORDER BY date) AS grp
   FROM   test_fill_null
   ) sub;

count() liczy tylko wartości inne niż null, więc grp jest zwiększana o każdą niepustą value , tworząc w ten sposób grupy według potrzeb. Wybór jednego jest trywialny niepusta value na grp w zewnętrznym SELECT .

W drugim przypadku , przyjmę, że początkowa kolejność wierszy jest określona przez (id1, id2, tms) zgodnie z jednym z Twoich zapytań.

SELECT id1, id2, tms
     , count(step) OVER (ORDER BY id1, id2, tms) AS group_id
FROM  (
   SELECT *, CASE WHEN lag(tms, 1, '-infinity') OVER (PARTITION BY id1 ORDER BY id2, tms)
                       < tms - interval '5 min'
                  THEN true END AS step
   FROM   table0
   ) sub
ORDER  BY id1, id2, tms;

Dostosuj się do aktualnego zamówienia. Jeden z nich może to obejmować:

PARTITION BY id1 ORDER BY id2  -- ignore tms
PARTITION BY id1 ORDER BY tms  -- ignore id2

Skrzypce SQL z rozszerzonym przykładem.

Powiązane:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przegląd generowanych kolumn dla PostgreSQL

  2. Kontener Dockera dla Postgres 9.1 nie ujawnia portu 5432 hostowi

  3. postgres nie wie, gdzie znaleźć plik konfiguracyjny serwera

  4. Dlaczego usunięcie indeksu trwa dłużej niż jego utworzenie?

  5. Używanie psycopg2 i Qthreads razem (lub po prostu postgresql i qthreads) i aktualizowanie GUI