sql >> Databáze >  >> RDS >> PostgreSQL

Jak označit skupiny v postgresql, když příslušnost ke skupině závisí na předchozím řádku?

„výběr v rámci výběru“ se častěji nazývá „podvýběr“ nebo „poddotaz“. Ve vašem konkrétním případě se jedná o korelovaný poddotaz . LATERAL spojení (nové v postgresu 9.3) mohou do značné míry nahradit korelované poddotazy flexibilnějšími řešeními:

Myslím, že tady nepotřebujete ani jedno.

Pro váš první případ tento dotaz je však pravděpodobně rychlejší a jednodušší:

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() počítá pouze nenulové hodnoty, takže grp se zvyšuje s každou nenulovou value , čímž se vytvoří skupiny podle potřeby. Je triviální vybrat jeden nenulová value za grp ve vnějším SELECT .

Pro váš druhý případ , budu předpokládat, že počáteční pořadí řádků je určeno (id1, id2, tms) jak je uvedeno v jednom z vašich dotazů.

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;

Přizpůsobte se vaší skutečné objednávce. Jedna z nich by to mohla pokrýt:

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

SQL Fiddle s rozšířeným příkladem.

Související:



  1. Integrace postgreSQL na WAMP

  2. Je rychlejší připojit/použít MySQL na localhost místo na doméně (i když se doména převádí na stejný počítač)?

  3. Správný způsob, jak získat uživatelské jméno a heslo z připojovacího řetězce?

  4. Načítání řádků pomocí spojovacího dotazu