Ghi chú:
- Nếu công thức của bạn thực sự hoạt động trong Excel, thì bạn đã lưu trữ ngày tháng trong ô chứ không phải thời gian.
- Đối với
D, E
, Tôi không hiểu, làm thế nào điều này sẽ trả về 'có' khi hàng trước đó không có cùng nhãn - Bạn phải thêm một số cột có ID vào bảng của mình (!). Trong khi Excel giữ nguyên thứ tự các hàng trong trang tính (trừ khi bạn thay đổi nó một cách rõ ràng), PostgreSQL thì không. Vì vậy, nếu bạn thực sự chỉ có thời gian trong cột thời gian, thì không có cách nào bạn có thể có được thứ tự các hàng giống như bạn có trong bảng của mình, dẫn đến kết quả hoàn toàn không chính xác.
- Nếu bạn đang sử dụng phiên bản 8.4 thì liên kết của bạn là chính xác, tuy nhiên sẽ tốt hơn nếu bạn sử dụng hiện tại tài liệu
Dữ liệu:
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');
Truy vấn:
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
Giải thích:
-
lag
hàm sẽ nhận giá trị ở hàng trước cho phân vùng đã cho. Trong trường hợp của chúng tôi, phân vùng được xác định theo nhãn. - toán tử truyền
::
sẽ thay đổitime
gõ vàointerval
, vì vậy chúng tôi có thể thêm thời gian và có hơn 24 giờ. - Chúng tôi so sánh tổng cộng với khoảng thời gian 24 giờ và hiển thị một nhãn đẹp
yes
hoặcno
.
Cập nhật:
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