Opmerkingen:
- Als je formule echt werkt in Excel, dan heb je datums in cellen opgeslagen, geen tijd.
- Voor
D, E
, ik begrijp niet, hoe dit 'ja' moet retourneren als de vorige rij niet hetzelfde label heeft - Je moet een kolom met ID aan je tabel toevoegen (!). Hoewel Excel dezelfde volgorde van rijen in het blad behoudt (tenzij u dit expliciet wijzigt), doet PostgreSQL dat niet. Dus als je echt alleen tijd hebt in kolomtijd, dan kun je op geen enkele manier dezelfde volgorde van rijen krijgen als in je tabel, wat leidt tot volledig onjuiste resultaten.
- Als je versie 8.4 gebruikt, dan is je link correct, maar het zou beter zijn als je de huidige documentatie
Gegevens:
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');
Vraag:
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
Uitleg:
lag
functie krijgt waarde in de vorige rij voor de gegeven partitie. In ons geval wordt partitie gedefinieerd door label.- cast-operator
::
veranderttime
typ ininterval
, zodat we tijd kunnen toevoegen en meer dan 24 uur kunnen krijgen. - We vergelijken het totaal met een interval van 24 uur en geven een mooi label weer
yes
ofno
.
Bijwerken:
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