PostgreSQL में श्रेणी के अनुसार अधिकतम तिथि समूह के साथ आईडी कैसे चुनें?


91

एक उदाहरण के लिए, मैं श्रेणी के अनुसार अधिकतम तिथि समूह के साथ आईडी का चयन करना चाहूंगा, परिणाम है: 7, 2, 6

id  category  date
1   a         2013-01-01
2   b         2013-01-03
3   c         2013-01-02
4   a         2013-01-02
5   b         2013-01-02
6   c         2013-01-03
7   a         2013-01-03
8   b         2013-01-01
9   c         2013-01-01

क्या मुझे पता है कि PostgreSQL में यह कैसे करना है?


4
अपने वर्जन को PostgreSQL में शामिल करना हमेशा समझदारी का काम है।
Erwin Brandstetter

जवाबों:


145

यह एक सही उपयोग के लिए मामला है DISTINCT ON- मानक का विशिष्ट विस्तार पोस्टग्रेज करता है DISTINCT:

SELECT DISTINCT ON (category)
       id  -- , category, date  -- any other column (expression) from the same row
FROM   tbl
ORDER  BY category, date DESC;

अवरोही क्रम क्रम से सावधान। यदि स्तंभ NULL हो सकता है, तो आप जोड़ना चाह सकते हैं NULLS LAST:

DISTINCT ONसरल और तेज है। इस संबंधित उत्तर में विस्तृत विवरण:

categoryवैकल्पिक दृष्टिकोण पर विचार करने के लिए कई पंक्तियों वाली बड़ी तालिकाओं के लिए :


बहुत अच्छा लगता है लेकिन क्या आपको पूरा यकीन है कि हर बार काम करने की गारंटी है?
एथेरियन

@ टिक्सल: बिल्कुल। अधिक जानकारी के लिए लिंक का अनुसरण करें।
एरविन ब्रान्डसेट्टर

21

इसको आजमाओ:

SELECT t1.* FROM Table1 t1
JOIN 
(
   SELECT category, MAX(date) AS MAXDATE
   FROM Table1
   GROUP BY category
) t2
ON T1.category = t2.category
AND t1.date = t2.MAXDATE

इस SQLFiddle देखें


1
रैंक () विंडो फ़ंक्शन का उपयोग करके एक और विकल्प है।
डेनिस डी बर्नार्डी

@ user1735921: आपको टेबल 1 से सभी कॉलम मिल जाएंगे। आप जो चाहें चुन सकते हैं।
हिमांशु जांसरी

16

एक अन्य दृष्टिकोण first_valueविंडो फ़ंक्शन का उपयोग करना है: http://sqlfiddle.com/# -12/7a145/14

SELECT DISTINCT
  first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) 
FROM Table1
ORDER BY 1;

... हालाँकि मुझे शक है कि ss056 का सुझाव आम तौर पर बेहतर प्रदर्शन करेगा जहाँ उपयुक्त सूचकांक मौजूद हैं।

एक तीसरा समाधान है:

SELECT
  id
FROM (
  SELECT
    id,
    row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum
  FROM Table1
) x
WHERE rownum = 1;

-5

बिल्ली से पसंदीदा आईडी समूह का चयन करें मैक्स (तारीख)


2
यह अवैध सिंटैक्स है और प्रश्न का उत्तर नहीं दे रहा है।
इरविन ब्रांडस्टेटर

4
यह PostgreSQL पर काम नहीं करता है, लेकिन Sqlite के साथ काम करता है
vladaman
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.