2017-12-06 12 views
0

Ich habe ein Programm, das den Status von Computern in einem Netzwerk durch PING jede Minute überprüft. Jedes Mal wird es eine neue Zeile DB einfügen wie folgt (ich verwende postgresql)Postgresql Tabelle gleiche Daten zuletzt neben Vorkommen und erste In einer Zeile

id_status status checking_time(timestamp) id_device(int) 
1   OK  '2017-01-01 00:00:00'  1 
2   OK  '2017-01-01 00:00:00'  2 
3   OK  '2017-01-01 00:00:00'  3 

4   Failed '2017-01-01 00:01:00'  1 
5   OK  '2017-01-01 00:01:00'  2 
6   OK  '2017-01-01 00:01:00'  3 

7   Failed '2017-01-01 00:02:00'  1 
8   OK  '2017-01-01 00:02:00'  2 
9   OK  '2017-01-01 00:02:00'  3 

10   Failed '2017-01-01 00:03:00'  1 
11   OK  '2017-01-01 00:03:00'  2 
12   OK  '2017-01-01 00:03:00'  3 

13   OK  '2017-01-01 00:04:00'  1 
14   OK  '2017-01-01 00:04:00'  2 
15   OK  '2017-01-01 00:04:00'  3 

I Ergebnis wie folgt

status from_time(timestamp) to_time(timestamp)  id_device(int) 
OK  '2017-01-01 00:00:00' '2017-01-01 00:01:00' 1 
Failed '2017-01-01 00:01:00' '2017-01-01 00:04:00' 1 
OK  '2017-01-01 00:04:00' NOW      1 

OK  '2017-01-01 00:00:00' NOW      2 
OK  '2017-01-01 00:00:00' NOW      3 
sein wollen

Wie kann ich diese Ausgabe bekommen ?.

Antwort

1

Es ist das Lücken und Inseln Problem. Es kann wie folgt gelöst werden:

select t.status, 
    t.from_time, 
    coalesce(CAST(lead(from_time) over (partition by id_device order by from_time) AS varchar(20)), 'NOW') to_date, 
    t.id_device 
from 
(
    select t.status, min(checking_time) from_time, t.id_device 
    from 
    (
     select *, row_number() over (partition by id_device, status order by checking_time) - 
        row_number() over (partition by id_device order by checking_time) grn 
     from data 
    ) t 
    group by t.id_device, grn, t.status 
) t 
order by t.id_device, t.from_time 

dbffile demo

Die entscheidende die verschachtelte Unterabfrage ist, wo ich zwei row_number Funktionen, um aufeinanderfolgende Auftreten des gleichen Status auf einem Gerät zu isolieren. Sobald Sie den grn Wert haben, ist der Rest einfach.

Ergebnis

status from_time   to_time    id_device 
------------------------------------------------------------ 
OK  2017-01-01 00:00:00 2017-01-01 00:01:00 1 
Failed 2017-01-01 00:01:00 2017-01-01 00:04:00 1 
OK  2017-01-01 00:04:00 NOW     1 
OK  2017-01-01 00:00:00 NOW     2 
OK  2017-01-01 00:00:00 NOW     3 

ähnliche Fragen

SQL query to get min, max rows

+0

Danke @Radim Bača Es ist wie Charme gearbeitet hat. –

+0

@MohamedNavas Sie sind herzlich willkommen :) –

Verwandte Themen