अगर आपके पास slno
नहीं है आपकी तालिका में, तो आपके पास कोई विश्वसनीय जानकारी नहीं है कि कौन सी पंक्ति पहले डाली गई थी। किसी तालिका में कोई प्राकृतिक क्रम नहीं है, पंक्तियों का भौतिक क्रम किसी भी समय बदल सकता है (किसी भी अद्यतन के साथ, या VACUUM
के साथ) , आदि)
आप कर सकते थे एक अविश्वसनीय . का उपयोग करें चाल:आंतरिक ctid
by द्वारा आदेश ।
select *
from (
select id, status
, row_number() OVER (PARTITION BY id
ORDER BY date, ctid) AS row_num
from status -- that's your table name??
where date >= '2015-06-01' -- assuming column is actually a date
and date < '2015-07-01'
) sub
where row_num = 1;
-
किसी अन्य जानकारी के अभाव में कौन सी पंक्ति पहले आई (जो एक डिज़ाइन त्रुटि . है शुरू करने के लिए, इसे ठीक करें!), आप आंतरिक टुपल आईडी
ctid
प्रारंभ में डालने पर पंक्तियाँ भौतिक क्रम में होंगी, लेकिन यह किसी भी समय तालिका या
VACUUM
में किसी भी लेखन कार्य के साथ बदल सकती हैं। या अन्य कार्यक्रम।
यह अंतिम उपाय का एक उपाय है और यह करेगा विराम। -
आपकी प्रस्तुत की गई क्वेरी कई मामलों में अमान्य थी:पहले सीटीई में कॉलम का नाम गायब, दूसरे सीटीई में टेबल का नाम गायब, ...
-
इसके लिए आपको सीटीई की जरूरत नहीं है।
DISTINCT ON
. के साथ आसान (ctid
के लिए विचार वही लागू करें):
SELECT DISTINCT ON (id)
id, status
FROM status
WHERE date >= '2015-06-01'
AND date < '2015-07-01'
ORDER BY id, date, ctid;