Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

अधिकतम मूल्य के आधार पर तालिकाओं में शामिल होना

संपादित प्रश्न का उत्तर देना (अर्थात संबद्ध कॉलम भी प्राप्त करने के लिए)।

Sql सर्वर 2005+ में, सबसे अच्छा तरीका यह होगा कि एक रैंकिंग/विंडो का उपयोग किया जाए। समारोह एक CTE के संयोजन में , इस तरह:

with exam_data as
(
    select  r.student_id, r.score, r.date,
            row_number() over(partition by r.student_id order by r.score desc) as rn
    from    exam_results r
)
select  s.name, d.score, d.date, d.student_id
from    students s
join    exam_data d
on      s.id = d.student_id
where   d.rn = 1;

एएनएसआई-एसक्यूएल अनुपालन समाधान के लिए, एक सबक्वेरी और सेल्फ-जॉइन इस तरह काम करेगा:

select  s.name, r.student_id, r.score, r.date
from    (
            select  r.student_id, max(r.score) as max_score
            from    exam_results r
            group by r.student_id
        ) d
join    exam_results r
on      r.student_id = d.student_id
and     r.score = d.max_score
join    students s
on      s.id = r.student_id;

यह अंतिम मानता है कि छात्र_आईडी/मैक्स_स्कोर संयोजन डुप्लिकेट नहीं हैं, यदि वहां हैं और/या आप उन्हें डी-डुप्लिकेट करने की योजना बनाना चाहते हैं, तो आपको यह तय करने के लिए कि कौन सा रिकॉर्ड खींचना है, आपको कुछ निर्धारित करने के लिए एक और सबक्वायरी का उपयोग करने की आवश्यकता होगी . उदाहरण के लिए, यह मानते हुए कि आपके पास एक ही तिथि वाले किसी दिए गए छात्र के लिए एकाधिक रिकॉर्ड नहीं हो सकते हैं, यदि आप नवीनतम max_score के आधार पर एक टाई तोड़ना चाहते हैं, तो आप निम्न की तरह कुछ करेंगे:

select  s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from    (
            select  r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
            from    (
                        select  r1.student_id, max(r1.score) as max_score
                        from    exam_results r1
                        group by r1.student_id
                    ) d
            join    exam_results r2
            on      r2.student_id = d.student_id
            and     r2.score = d.max_score
            group by r2.student_id, r2.score
        ) r
join    exam_results r3
on      r3.student_id = r.student_id
and     r3.score = r.max_score
and     r3.date = r.max_score_max_date
join    students s
on      s.id = r3.student_id;

संपादित करें:टिप्पणियों में मार्क की अच्छी पकड़ के लिए उचित डी-डुप्लिकेटिंग क्वेरी जोड़ा गया



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL / MySQL - कॉलम की लंबाई के अनुसार क्रम

  2. बिना री-इंस्टॉल किए वैंप सर्वर को कैसे रिपेयर करें?

  3. NodeJS MySQL:क्वेरी निष्पादन समय मापें

  4. बस mysql डेटाबेस में 5 अंकों की संख्या को दिनांक में बदलें

  5. MySQL डेटा क्वेरी से XML फ़ाइल कैसे बनाएं?