Catatan:
- Jika rumus Anda benar-benar berfungsi di Excel, maka Anda telah menyimpan tanggal dalam sel, bukan waktu.
- Untuk
D, E
, saya tidak mengerti, bagaimana ini harus mengembalikan 'ya' ketika baris sebelumnya tidak memiliki label yang sama - Anda harus menambahkan beberapa kolom dengan ID ke tabel Anda (!). Sementara Excel menyimpan urutan baris yang sama dalam lembar (kecuali Anda mengubahnya secara eksplisit), PostgreSQL tidak. Jadi, jika Anda benar-benar hanya memiliki waktu dalam waktu kolom, maka tidak mungkin Anda bisa mendapatkan urutan baris yang sama seperti yang Anda miliki di tabel Anda, sehingga menghasilkan hasil yang benar-benar salah.
- Jika Anda menggunakan versi 8.4 maka tautan Anda sudah benar, namun akan lebih baik jika Anda menggunakan dokumentasi
Data:
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');
Pertanyaan:
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
Penjelasan:
lag
fungsi akan mendapatkan nilai di baris sebelumnya untuk partisi yang diberikan. Dalam kasus kami, partisi ditentukan oleh label.- operator pemeran
::
akan mengubahtime
ketikinterval
, sehingga kami dapat menambah waktu dan mendapatkan lebih dari 24 jam. - Kami membandingkan total dengan interval 24 jam dan menampilkan label yang bagus
yes
atauno
.
Pembaruan:
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