sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur märker man grupper i postgresql när grupptillhörighet beror på föregående rad?

Ett "välj inom ett urval" kallas oftare "subselect" eller "subquery" I ditt specifika fall är det en korrelerad underfråga . LATERAL joins (ny i postgres 9.3) kan till stor del ersätta korrelerade underfrågor med mer flexibla lösningar:

Jag tror inte att du behöver det heller här.

För ditt första fall den här frågan är förmodligen snabbare och enklare, dock:

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() Räknar bara icke-nullvärden, så grp ökas med varje value som inte är null och bildar därigenom grupper efter önskemål. Det är trivialt att välja en icke-null value per grp i den yttre SELECT .

För ditt andra fall , jag antar att den initiala ordningen på raderna bestäms av (id1, id2, tms) som indikeras av en av dina frågor.

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;

Anpassa till din faktiska beställning. En av dessa kan täcka det:

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

SQL Fiddle med ett utökat exempel.

Relaterat:



  1. Mer SQL, mindre kod, med PostgreSQL

  2. Hur man korrekt indexerar en länkningstabell för många-till-många-anslutning i MySQL?

  3. Skapa trigger för att logga SQL som påverkade tabellen?

  4. Unik begränsning som kontrollerar två kolumner i MySQL