sql >> Databasteknik >  >> RDS >> PostgreSQL

Välj data för 15 minuters fönster - PostgreSQL

Snabbt och smutsigt sätt:http://sqlfiddle.com/#!1/bd2f6/21 Jag döpte min kolumn till tstamp istället för din timestamp

with t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmp) a,
    (select duration from tmp group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmp on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

Kort förklaring:

  1. Beräkna lägsta och högsta tidsstämpel
  2. Generera 15 minuters intervall mellan minimum och maximum
  3. Resultat för korskoppling med unika värden för varaktighet
  4. Left join originaldata (left join är viktigt, eftersom detta kommer att behålla alla möjliga kombinationer i utdata och det blir null där varaktigheten inte existerar för givet intervall.
  5. Aggregerad data. count(null)=0

Om du har fler tabeller och algoritmen bör tillämpas på deras förening. Anta att vi har tre tabeller tmp1, tmp2, tmp3 alla med kolumner tstamp och duration . Vi kan utöka den tidigare lösningen:

with 

tmpout as (
  select * from tmp1 union all
  select * from tmp2 union all
  select * from tmp3
)

,t as (
  select
    generate_series(mitstamp,matstamp,'15 minutes') as int,
    duration
  from
    (select min(tstamp) mitstamp, max(tstamp) as matstamp from tmpout) a,
    (select duration from tmpout group by duration) b
)

select
  int as timestampwindowstart,
  t.duration,
  count(tmp.duration)
from
   t
   left join tmpout on 
         (tmp.tstamp >= t.int and 
          tmp.tstamp < (t.int + interval '15 minutes') and 
          t.duration = tmp.duration)
group by
  int,
  t.duration
order by
  int,
  t.duration

Du borde verkligen känna till with klausul i PostgreSQL. Det är ett ovärderligt koncept för all dataanalys i PostgreSQL.




  1. Anslut till MySQL med SSH Tunneling i node-mysql

  2. En guide till databasautomatisering med Severalnines ClusterControl

  3. Varför orsakar syntaxfel att lägga till '*' i en MySQL-fråga?

  4. mysql räkna rader med loop