Бележки:
- Ако вашата формула действително работи в Excel, тогава сте съхранили дати в клетки, а не време.
- За
D, E
, не разбирам как това трябва да върне „да“, когато предишният ред няма същия етикет - Трябва да добавите колона с ID към вашата таблица (!). Докато Excel запазва същия ред на редовете в листа (освен ако не го промените изрично), PostgreSQL не го прави. По този начин, ако наистина имате само време във времето на колона, тогава няма начин да получите същия ред на редовете, както имате във вашата таблица, което води до напълно неправилни резултати.
- Ако използвате версия 8.4, връзката ви е правилна, но би било по-добре да използвате текущия документация
Данни:
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');
Заявка:
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
Обяснение:
lag
функцията ще получи стойност в предишния ред за даден дял. В нашия случай дялът се определя от етикет.- каст оператор
::
ще промениtime
въведетеinterval
, така че можем да добавим време и да получим повече от 24 часа. - Сравняваме общата сума с интервал от 24 часа и показваме хубав етикет
yes
илиno
.
Актуализация:
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