इसे यह करना चाहिए:
delete from devices
using (
select ctid as cid,
row_number() over (partition by devicename, objectid order by timestamp asc) as rn
from devices
) newest
where newest.cid = devices.ctid
and newest.rn <> 1;
यह एक व्युत्पन्न तालिका बनाता है जो (पता, डिवाइसनाम, ऑब्जेक्टिड) के प्रत्येक संयोजन के लिए अद्वितीय संख्या प्रदान करेगा (सबसे छोटा टाइमस्टैम्प वाला एक) value) नंबर 1. फिर इस परिणाम का उपयोग उन सभी को हटाने के लिए किया जाता है जिनके पास नंबर 1 नहीं है। वर्चुअल कॉलम
ctid
उन पंक्तियों को विशिष्ट रूप से पहचानने के लिए उपयोग किया जाता है (यह Postgres द्वारा आपूर्ति की गई एक आंतरिक पहचानकर्ता है)।
ध्यान दें कि वास्तव में बड़ी मात्रा में पंक्तियों को हटाने के लिए, इरविन का दृष्टिकोण निश्चित रूप से तेज़ होगा।
SQLFiddle डेमो:http://www.sqlfiddle.com/#!1/5d9fe/ 2