sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan mærker man grupper i postgresql, når gruppetilhørsforhold afhænger af den foregående linje?

Et "vælg i et udvalg" kaldes mere almindeligt "subselect" eller "subquery" I dit særlige tilfælde er det en korreleret underforespørgsel . LATERAL joins (nyt i postgres 9.3) kan stort set erstatte korrelerede underforespørgsler med mere fleksible løsninger:

Jeg tror heller ikke du behøver her.

Til dit første tilfælde denne forespørgsel er sandsynligvis hurtigere og enklere, selvom:

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() tæller kun værdier, der ikke er nul, så grp øges med hver ikke-null value og derved danne grupper efter ønske. Det er trivielt at vælge den en ikke-null value pr. grp i den ydre SELECT .

Til dit andet tilfælde , antager jeg, at den indledende rækkefølge af rækker er bestemt af (id1, id2, tms) som angivet af en af ​​dine forespørgsler.

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;

Tilpas til din faktiske ordre. En af disse kan dække det:

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

SQL Fiddle med et udvidet eksempel.

Relateret:



  1. Sådan fungerer WEIGHT_STRING() i MariaDB

  2. I hvilken rækkefølge ændrer Oracle SQL-opdateringssætning kolonneværdier?

  3. Få nyt indsat record ID i CFScript

  4. MySQL, CONCAT, resultatet er null efter et stykke tid