2012-07-09 15 views
8

मैं केवल तालिका user_payments user_id साथ उपयोगकर्ता के लिए 1.मैक्स (DATE) - एसक्यूएल ओरेकल

बराबर की से नवीनतम membership_id चयन करना चाहते हैं यह कैसे तालिका user_payment लग रहा है जैसे:

PAYM_ID USER_ID MEMBSHIP_ID PAYM_DATE      
---------- ---------- ----------- ------------------------------- 
     1   1   1 18-DEC-09 12.00.00.000000000 AM 
     2   1   2 18-DEC-10 12.00.00.000000000 AM 
     3   1   2 18-DEC-11 12.00.00.000000000 AM 
     4   2   3 17-MAR-11 12.00.00.000000000 AM 
     5   3   3 18-JUN-12 12.00.00.000000000 AM 
     6   4   2 17-FEB-12 12.00.00.000000000 AM 
     7   5   2 18-FEB-11 12.00.00.000000000 AM 
     8   5   2 18-FEB-12 12.00.00.000000000 AM 
     9   6   1 01-JUN-12 12.00.00.000000000 AM 
     10   7   1 03-FEB-11 12.00.00.000000000 AM 
     11   7   2 03-FEB-12 12.00.00.000000000 AM 

मुझे कोई सफलता के साथ कोशिश कर रहा हूँ निम्नलिखित कोड:

SELECT MEMBSHIP_ID 
FROM user_payment 
WHERE user_id=1 and MAX(paym_date); 

और मैं इस त्रुटि मिलती है: एसक्यूएल त्रुटि: ORA-00934: समूह कार्य की अनुमति नहीं है यहां 00934. 00000 - "समूह फ़ंक्शन की अनुमति नहीं है"

मैं इसे कैसे ठीक कर सकता हूं? अग्रिम में धन्यवाद!

उत्तर

14
select * from 
    (SELECT MEMBSHIP_ID 
    FROM user_payment WHERE user_id=1 
    order by paym_date desc) 
where rownum=1; 
7
SELECT p.MEMBSHIP_ID 
FROM user_payments as p 
WHERE USER_ID = 1 AND PAYM_DATE = (
    SELECT MAX(p2.PAYM_DATE) 
    FROM user_payments as p2 
    WHERE p2.USER_ID = p.USER_ID 
) 
+1

इस उत्तर सबक्वेरी संबद्ध करता है। आपको user_id तर्क को कई स्थानों पर बदलने की आवश्यकता नहीं होगी और यदि आप इसे अन्य कोड से उपयोग करते हैं तो आपको एकाधिक पैरामीटर बनाने से निपटने की आवश्यकता नहीं होगी। MAX कुल योग के विकल्प के रूप में row_number() रैंकिंग फ़ंक्शन का सुझाव देने के लिए – shawnt00

3

प्रयास करें:

SELECT MEMBSHIP_ID 
    FROM user_payment 
WHERE user_id=1 
ORDER BY paym_date = (select MAX(paym_date) from user_payment and user_id=1); 

या:

SELECT MEMBSHIP_ID 
FROM (
    SELECT MEMBSHIP_ID, row_number() over (order by paym_date desc) rn 
     FROM user_payment 
    WHERE user_id=1) 
WHERE rn = 1 
+0

+1। समस्या पर हमला करने के लिए बस एक अलग तरीका है। – Baodad

+0

वही, row_number() रैंकिंग फ़ंक्शन मुझे अच्छी तरह से सेवा देता है – Ian

0

ओरेकल 9i + (शायद भी 8i) प्रथम/अंतिम कुल काम करता है, कि अनुसार पंक्तियों के समूह से अधिक गणना कर है समूह में पंक्ति के रैंक के लिए। एक समूह के रूप में सभी पंक्तियों मान लिया जाये, तो आप सबक्वेरी के बिना आप क्या चाहते हैं मिल जाएगा:

SELECT 
    max(MEMBSHIP_ID) 
    keep (
     dense_rank first 
     order by paym_date desc NULLS LAST 
) as LATEST_MEMBER_ID 
FROM user_payment 
WHERE user_id=1 
-1

साथ प्रयास करें:

select TO_CHAR(dates,'dd/MM/yyy hh24:mi') from ( SELECT min (TO_DATE(a.PAYM_DATE)) as dates from user_payment a) 
संबंधित मुद्दे