PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie beschriftet man Gruppen in Postgresql, wenn die Gruppenzugehörigkeit von der vorhergehenden Zeile abhängt?

Ein "Auswahl innerhalb einer Auswahl" wird häufiger als "subselect" oder "subquery" bezeichnet. In Ihrem speziellen Fall handelt es sich um eine korrelierte Unterabfrage . LATERAL Joins (neu in Postgres 9.3) können korrelierte Unterabfragen weitgehend durch flexiblere Lösungen ersetzen:

Ich glaube nicht, dass Sie beides hier brauchen.

Für Ihren ersten Fall Diese Abfrage ist jedoch wahrscheinlich schneller und einfacher:

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() zählt nur Nicht-Null-Werte, also grp wird mit jedem value ungleich Null erhöht , wodurch wie gewünscht Gruppen gebildet werden. Es ist trivial, den einen auszuwählen Nicht-Null-value pro grp im äußeren SELECT .

Für Ihren zweiten Fall , gehe ich davon aus, dass die anfängliche Reihenfolge der Zeilen durch (id1, id2, tms) bestimmt wird wie in einer Ihrer Abfragen angegeben.

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;

An Ihre tatsächliche Bestellung anpassen. Eine davon könnte es abdecken:

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

SQL-Fiddle mit einem erweiterten Beispiel.

Verwandte: