क्रमबद्ध उपसमूहों की अधिकतम पंक्तियों का चयन करें

Aug 18 2020

PostgreSQL 11 का उपयोग करते हुए, मेरे पास हर महीने के प्रत्येक दिन के लिए एक DAY और MONTH_TO_DAY प्रविष्टि वाली तालिका है। मैं प्रत्येक खाते के लिए हाल ही के MONTH_TO_DAY प्रविष्टि का चयन करना चाहूंगा। मेरी तालिका है:

+------+------------+--------------+------------+--------------------------+
|id    |account     |code          |interval    |timestamp                 |
+------+------------+--------------+------------+--------------------------+
|387276|ALPBls6EsP  |52            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387275|ALPBls6EsP  |52            |DAY         |2020-09-01 01:05:00.000000|
|387272|YkON8lk8A8  |25            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387271|YkON8lk8A8  |25            |DAY         |2020-08-01 01:05:00.000000|
|387273|ALPBls6EsP  |32            |MONTH_TO_DAY|2020-08-31 01:05:00.000000|
|387274|ALPBls6EsP  |32            |DAY         |2020-08-31 01:05:00.000000|
|387272|ALPBls6EsP  |27            |MONTH_TO_DAY|2020-08-30 01:05:00.000000|
|387271|ALPBls6EsP  |27            |DAY         |2020-08-30 01:05:00.000000|
+------+------------+--------------+------------+--------------------------+

यदि यह मदद करता है, तो प्रविष्टियां हमेशा अवरोही क्रम में होती हैं।

सभी खातों के लिए पूछने वाले एक प्रश्न में, चूंकि 31 तारीख 08 का अंतिम दिन है और पहली बार 09 की सबसे हाल की प्रविष्टि है, मेरा अपेक्षित उत्पादन होगा

+------+------------+--------------+------------+--------------------------+
|id    |account     |code          |interval    |timestamp                 |
+------+------------+--------------+------------+--------------------------+
|387276|ALPBls6EsP  |52            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387272|YkON8lk8A8  |25            |MONTH_TO_DAY|2020-09-01 01:05:00.000000|
|387273|ALPBls6EsP  |32            |MONTH_TO_DAY|2020-08-31 01:05:00.000000|
+------+------------+--------------+------------+--------------------------+

मैं सोच रहा था कि मैं महीने तक समूह प्रविष्टियों को पसंद करूँगा (dd / hh / ss को कम कर दूं), और फिर प्रत्येक समूह में अधिकतम टाइमस्टैम्प के साथ पंक्ति का चयन करूँ। मुझे इसके साथ सही पंक्तियाँ मिल सकती हैं लेकिन मैं यह पता नहीं लगा सकता कि किसी अन्य क्षेत्र को कैसे प्राप्त किया जाए।

SELECT max(timestamp) 
FROM mytable 
GROUP BY date_trunc('month', mytable.timestamp);

मैंने यह भी सोचा कि मैं नीचे की तरह कुछ पर अलग-अलग उपयोग कर सकता हूं, लेकिन मैं अलग से या डेट_ट्रूनक पर परिचित नहीं हूं और मैं यह पता नहीं लगा सकता कि उन्हें एक साथ कैसे उपयोग किया जाए।

SELECT distinct on (timestamp)
    *
FROM mytable
ORDER BY date_trunc('month', mytable.timestamp)

जवाब

MikeOrganek Aug 18 2020 at 07:03

आप चाहते हैं distinct on, लेकिन आप इसे लागू करना चाहते हैं account:

select distinct on (account) *
  from mytable
 where interval = 'MONTH_TO_DAY'
 order by account, timestamp desc;

आप द्वारा नवीनतम चाहते हैं accountद्वारा month, तो यह काम करना चाहिए:

select distinct on (date_trunc('month', timestamp), account) *
  from mytable
 where interval = 'MONTH_TO_DAY'
 order by date_trunc('month', timestamp), account, timestamp desc;