Uwagi:
- Jeśli Twoja formuła faktycznie działa w Excelu, to w komórkach zapisałeś daty, a nie czas.
- Dla
D, E
, nie rozumiem, jak to powinno zwrócić 'tak', gdy poprzedni wiersz nie ma tej samej etykiety - Musisz dodać do swojej tabeli kolumnę z identyfikatorem (!). Podczas gdy Excel zachowuje tę samą kolejność wierszy w arkuszu (chyba że zmienisz to jawnie), PostgreSQL nie. Tak więc, jeśli naprawdę masz tylko czas w kolumnie, nie ma możliwości uzyskania takiej samej kolejności wierszy, jak w tabeli, co prowadzi do całkowicie błędnych wyników.
- Jeśli używasz wersji 8.4, Twój link jest poprawny, jednak byłoby lepiej, jeśli użyjesz aktualnego dokumentacja
Dane:
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');
Zapytanie:
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
Wyjaśnienie:
lag
funkcja otrzyma wartość z poprzedniego wiersza dla danej przegrody. W naszym przypadku partycja jest zdefiniowana przez etykietę.- operator rzutowania
::
zmienitime
wpisz winterval
, dzięki czemu możemy dodać czas i uzyskać więcej niż 24 godziny. - Porównujemy łączny interwał z 24 godzinami i wyświetlamy ładną etykietę
yes
lubno
.
Aktualizacja:
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