PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL - Weisen Sie jeder Zeile basierend auf Kriterien einen Wert zu

Hinweise:

  1. Wenn Ihre Formel tatsächlich in Excel funktioniert, dann haben Sie Daten in Zellen gespeichert, nicht Zeit.
  2. Für D, E , ich verstehe nicht, wie dies "Ja" zurückgeben soll, wenn die vorherige Zeile nicht dieselbe Bezeichnung hat
  3. 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.
  4. 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:

  1. 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.
  2. cast-Operator :: ändert die time Geben Sie in interval ein , sodass wir Zeit hinzufügen und mehr als 24 Stunden erhalten.
  3. Wir vergleichen die Gesamtsumme mit einem 24-Stunden-Intervall und zeigen ein nettes Label yes an oder no .

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