नोट:
- यदि आपका सूत्र वास्तव में एक्सेल में काम करता है, तो आपने तिथियों को सेल में संग्रहीत किया है, समय नहीं।
D, E
के लिए , मुझे समझ में नहीं आता, जब पिछली पंक्ति में समान लेबल नहीं है तो यह 'हां' कैसे वापस आना चाहिए- आपको अपनी तालिका में आईडी के साथ कुछ कॉलम जोड़ना होगा (!)। जबकि एक्सेल शीट में पंक्तियों का समान क्रम रखता है (जब तक कि आप इसे स्पष्ट रूप से नहीं बदलते), 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
lag
में टाइप करें , ताकि हम समय जोड़ सकें और 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