2016-06-13 6 views
0

Ich habe nicht eine ähnliche Frage gefunden, aber gerne weiter einen zu spitz oder beantwortet ...Sequenz nach Datum, fügen Sie Datum vor und das Datum nach postgresql mit subquery

Hintergrund ich eine Datenbank : DB1 von Fahrzeugen mit 6 Mio. Reihen für jeden Monat. Und DB2 von Ereignissen mit 400k Zeilen für das ganze Jahr. Beide enthalten Orte (x, y). Ich versuche, sie anhand von Daten und Entfernungen in postGIS zu referenzieren. Idealerweise hätte ich gerne für jedes Ereignis in DB2 ein Histogramm von Abständen von Fahrzeugen in DB1, die vor und nach 1 Stunde da waren. Aber vorher ich prepping die DB1 und damit meine Frage

Frage ich für jedes Fahrzeug in DB1 hinzufügen möchte time_prev, time_next und time_sequence für jeden Tag wie hier

DB1 before, DB1 after Link zu ein Stück gereinigt Daten von DB1: https://docs.google.com/spreadsheets/d/1_mz1JqQJu4VZ7iJ6WLezH7rZhurOIPDQu3flv8Qz058/edit?usp=sharing

ich bin immer noch nicht sicher, wie von dort fortzusetzen, damit Ideen willkommen wären ...

+1

Lesen Sie über 'LEAD()/LAG()' Fensterfunktionen. – sagi

Antwort

1

Verwenden Sie window functions.

select 
    *, 
    lag(timestamp) over wa time_prev, 
    lead(timestamp) over wa time_next, 
    to_char(timestamp, 'yyyymmdd') || to_char(row_number() over wd, 'fm0009') time_sequence 
from db1 
window 
    wa as (partition by vehicle_id order by objectid), 
    wd as (partition by vehicle_id, timestamp::date order by objectid); 


objectid | vehicle_id |  timestamp  |  time_prev  |  time_next  | time_sequence 
----------+------------+---------------------+---------------------+---------------------+--------------- 
     1 |   1 | 2009-06-01 11:57:43 |      | 2009-06-01 11:09:16 | 200906010001 
     4 |   1 | 2009-06-01 11:09:16 | 2009-06-01 11:57:43 | 2009-06-01 10:16:28 | 200906010002 
     6 |   1 | 2009-06-01 10:16:28 | 2009-06-01 11:09:16 | 2009-06-01 09:33:01 | 200906010003 
     11 |   1 | 2009-06-01 09:33:01 | 2009-06-01 10:16:28 | 2009-06-01 11:30:19 | 200906010004 
     12 |   1 | 2009-06-01 11:30:19 | 2009-06-01 09:33:01 |      | 200906010005 
     2 |   2 | 2009-06-01 10:42:19 |      | 2009-06-01 11:02:23 | 200906010001 
     3 |   2 | 2009-06-01 11:02:23 | 2009-06-01 10:42:19 | 2009-06-01 10:32:19 | 200906010002 
     7 |   2 | 2009-06-01 10:32:19 | 2009-06-01 11:02:23 | 2009-06-01 09:20:31 | 200906010003 
     9 |   2 | 2009-06-01 09:20:31 | 2009-06-01 10:32:19 | 2009-06-01 11:56:23 | 200906010004 
     13 |   2 | 2009-06-01 11:56:23 | 2009-06-01 09:20:31 |      | 200906010005 
     5 |   3 | 2009-06-01 11:56:47 |      | 2009-06-01 10:52:19 | 200906010001 
     8 |   3 | 2009-06-01 10:52:19 | 2009-06-01 11:56:47 | 2009-06-01 11:06:39 | 200906010002 
     10 |   3 | 2009-06-01 11:06:39 | 2009-06-01 10:52:19 |      | 200906010003 
(13 rows) 
+0

das funktionierte, tnx) dauerte 61 Minuten für ~ 6 Millionen Zeilen. irgendwelche Ideen, wie man fortfährt? – Lizardie

+1

Sie können die Abfrage schneller machen, indem Sie den Index 'create index on db1 (vehicle_id, objectid)' definieren. Ich denke, dass Sie eine neue Frage über den nächsten Schritt stellen können (es ist nicht ganz klar für mich). – klin