Hinweise:
- Wenn Ihre Formel tatsächlich in Excel funktioniert, dann haben Sie Daten in Zellen gespeichert, nicht Zeit.
- Für
D, E
, ich verstehe nicht, wie dies "Ja" zurückgeben soll, wenn die vorherige Zeile nicht dieselbe Bezeichnung hat - Sie müssen Ihrer Tabelle eine Spalte mit ID hinzufügen (!). Während Excel die gleiche Reihenfolge der Zeilen im Blatt beibehält (es sei denn, Sie ändern sie explizit), tut PostgreSQL dies nicht. Wenn Sie also wirklich nur Zeit in der Spaltenzeit haben, können Sie auf keinen Fall dieselbe Reihenfolge der Zeilen wie in Ihrer Tabelle erhalten, was zu völlig falschen Ergebnissen führt.
- Wenn Sie Version 8.4 verwenden, ist Ihr Link korrekt, es wäre jedoch besser, wenn Sie den aktuellen Dokumentation
Daten:
drop table if exists tmp.test;
create table tmp.test (id int, ddate date, label varchar, ttime time);
insert into tmp.test values
(1, '2014/6/4','A','12:05:56'),
(2, '2014/6/4','A','23:02:32'),
(3, '2014/6/4','B','8:39:25'),
(4, '2014/6/4','B','12:36:37'),
(5, '2014/6/4','C','12:20:43'),
(6, '2014/6/4','C','12:56:44'),
(7, '2014/6/4','D','20:52:22'),
(8, '2014/6/4','E','22:25:30'),
(9, '2014/6/4','F','12:16:15'),
(10, '2014/6/4','F','12:31:09'),
(11, '2014/6/4','F','7:12:06'),
(12, '2014/6/4','G','7:48:32'),
(13, '2014/6/4','H','17:58:11');
Abfrage:
select
id,
ddate,
label,
ttime,
case when (lag(ttime) over(partition by label order by id))::interval
+ ttime::interval > interval '24 hours' then 'yes' else 'no' end
-- ,(lag(ttime) over(partition by label order by ttime))::interval + ttime::interval
from
tmp.test
Erklärung:
lag
Die Funktion erhält den Wert in der vorherigen Zeile für die angegebene Partition. In unserem Fall wird die Partition durch das Label definiert.- cast-Operator
::
ändert dietime
Geben Sie ininterval
ein , sodass wir Zeit hinzufügen und mehr als 24 Stunden erhalten. - Wir vergleichen die Gesamtsumme mit einem 24-Stunden-Intervall und zeigen ein nettes Label
yes
an oderno
.
Aktualisieren:
select
id,
ddate,
label,
ttime,
case when lead(label) over(partition by label order by id) is null then 'no' else 'yes' end
from
tmp.test