Abfragen von Summen gruppierter aufeinanderfolgender Zeilen in PostgreSQL 9


8

Ich habe Daten über Menschen, die in verschiedenen Ländern wie diesen reisen:

country | begintimestamp      | distance    

Germany | 2015-01-01 00:00:00 | 100
Germany | 2015-01-01 01:12:13 | 30
France  | 2015-01-01 02:13:14 | 40
France  | 2015-01-01 03:14:15 | 20
Spain   | 2015-01-01 04:15:16 | 10
France  | 2015-01-01 05:16:17 | 30
France  | 2015-01-01 05:17:18 | 5
Germany | 2015-01-01 06:18:19 | 3

Was ich brauche, ist in der Lage zu sein, ein Ergebnis wie dieses zu erhalten - das distancevon aufeinanderfolgenden Zeilen, die mit den frühesten summiert werden begintimestamp:

country | begintimestamp      | distance

Germany | 2015-01-01 00:00:00 | 130  // 100+30, the distance of two first rows summed.
France  | 2015-01-01 02:13:14 | 60   // 40+20
Spain   | 2015-01-01 04:15:16 | 10   // 
France  | 2015-01-01 05:16:17 | 35   // 30+5
Germany | 2015-01-01 06:18:19 | 3

Ich habe versucht, mit PG-Fensterfunktionen herumzuspielen, konnte jedoch nichts finden, was mich dem Ergebnis näher bringen würde.

Antworten:


13
select min(country) as country,
       min(begintimestamp) as first_begin_ts, 
       sum(distance) as distance
from (
  select t1.*, 
         sum(group_flag) over (order by begintimestamp) as grp
  from (
      select *,
             case
                when lag(country) over (order by begintimestamp) = country then null
                else 1
              end as group_flag
      from travel
  ) t1
) t2
group by grp
order by first_begin_ts;

Die innerste Abfrage (Alias t1) erstellt bei jedem Länderwechsel eine Nummer. Die Abfrage der zweiten Ebene (Alias t2) führt dann eine laufende Summe für diese Flags durch, wodurch im Wesentlichen jeder aufeinanderfolgenden Gruppe von Ländern eine andere Nummer zugewiesen wird. Die äußerste Abfrage gruppiert sich dann nach dieser Zahl und summiert die Entfernung. Das min(country)ist notwendig, um den group byBediener glücklich zu machen , aber da alle Zeilen mit grpdemselben ohnehin dasselbe Land haben, spielt es keine Rolle.

SQLFiddle: http://sqlfiddle.com/#!15/fe341/1

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.