Hirdetés

Új hozzászólás Aktív témák

  • nyunyu
    félisten

    Üdv!

    PostgreSQL-ben timestamp alapján szeretnék GROUP BY-olni a következő módon: adott egy timestamp mező másodperces felbontásban és a cél az lenne, hogy azok a sorok kerüljenek összevonásra, amelyek közül a min és a max közti időkülönbség nem nagyobb 1 percnél.
    Tehát pl. a '2021-06-08 10:11:34' és a '2021-06-08 10:12:10' össze kell, hogy vonódjon. Addig megoldottam, hogy perces bontásban legyenek csoportosítva, de ez így nem az igazi, mivel 2 másodperc különbség miatt (változik a perc, egyiknél 0 perc 59 másoderc, másiknál 1 perc 01 másodperc) is külön csoportba kerülnek.

    Jelenleg így néz ki:

    SELECT 
      COUNT(*), 
       date_trunc('hour', datetime) +   (
        (
          (
          date_part('minute', datetime):: integer / 1 :: integer
          ) * 1 :: integer
        )   || ' minutes'
      ):: interval AS one_min_timestamp 
    FROM 
      table 
    GROUP BY 
      one_min_timestamp 
    ORDER BY 
      one_min_timestamp;

    Van esetleg valami tippetek miként lehetne ezt továbbfejleszteni a fentebb felvázolt módon?

    Nem lenne egyszerűbb az időbélyegek különbsége alapján számolni?

    SQL szabvány szerint mint a dátum, mind az időbélyeg típusok kivonhatóak egymásból és akkor kapsz egy időintervallumot.
    Vagy dátum+időintervallum=dátum, időbélyeg+időintervallum=időbélyeg!

    Én legalábbis úgy nézném meg, hogy mi a legsűrűbben logolt környék, hogy önmagával összejoinolnám a táblát, hogy a második rekord időbélyege nagyobb legyen, mint az elsőé, és a különbségük egy percen belül legyen, aztán ezt a halmazt group by-olnám az első időbélyegre, és megszámolni, hány második tartozik hozzá.

    valami ilyesmire gondoltam:
    SELECT y.date, y.cnt
    FROM (
    SELECT x.date, count(x.date2) cnt
    FROM (
    SELECT a.date, b.date as date2
    FROM table a
    JOIN table b
    ON b.date > a.date
    AND b.date < a.date + interval '1' minute) x
    GROUP BY x.date) y
    ORDER BY y.cnt desc;

    Itt az erős join miatt csak azokat az dátumokat/időbélyegeket fogod visszakapni, ahol egy percen belül volt legalább egy másik bejegyzés.
    Magányos, kósza bejegyzéseket nem! (mondjuk a b.date >= a.date feltétellel azokat is figyelembe lehetne venni.)

Új hozzászólás Aktív témák