2011-06-06 16 views
5

से 1 का चयन करें मेरे पास डेटा का एक सेट है और प्रत्येक CON/OWNER/METHOD/MATRIX सेट के लिए एक रिकॉर्ड खींचने की आवश्यकता है। यदि कोई गैर-शून्य परिणाम है, तो मैं उसे चाहता हूं। अन्यथा, मैं सबसे ज्यादा COUNT वाला एक चाहता हूं। मैं यह कैसे पूछूं?SQL सर्वर क्वेरी प्रत्येक उप-समूह

CON  OWNER  METHOD  MATRIX RESULT COUNT 
*CON_1 OWNER_1 METHOD_A SOLID NULL 503 
CON_1 OWNER_1 METHOD_A SOLID NULL 1 

*CON_1 OWNER_1 METHOD_A SOIL NULL 1305 
CON_1 OWNER_1 METHOD_A SOIL NULL 699 

*CON_2 OWNER_2 METHOD_B SOLID 290  687 
CON_2 OWNER_2 METHOD_B SOLID NULL NULL 
CON_2 OWNER_2 METHOD_B SOLID 450  600 

CON_2 OWNER_2 METHOD_B WATER NULL 1 
*CON_2 OWNER_2 METHOD_B WATER 400  NULL 
एक परिणाम के लिए

, मैं सिर्फ तारांकित रिकॉर्ड चाहते हैं, और मैं दिखा रहा हूँ कि कैसे प्रत्येक सेट वर्गीकृत किया जाता है।

यह बुरा एसक्यूएल है:

select top (1) CON, OWNER, METHOD, MATRIX, RESULT, COUNT 
from #TempTable 
group by CON, OWNER, METHOD, MATRIX 
order by CON, OWNER, METHOD, MATRIX, COUNT 

... क्योंकि मेरे गिनती में समेकित फ़ंक्शन का हिस्सा नहीं है। न ही यह परिणाम नल के साथ सौदा करता है या नहीं, और शीर्ष (1) प्रत्येक समूह से 1 वापस नहीं करेगा। हालांकि, मुझे अधिक जटिल क्वेरी (जैसे How can I select multiple columns from a subquery (in SQL Server) that should have one record (select top 1) for each record in the main query? पर प्रश्न के आधार पर)

मैं प्रत्येक समूह से एक का चयन कैसे करूं?

+0

यह चुनना मुश्किल है कि @siva, @Paul Creasey, या @Andrew Lazarus को स्वीकार करना है। सभी मदद की। एंड्रयू का प्रारंभिक और अच्छी तरह से स्वरूपित था और बेहतर सॉर्टिंग था; शिव के पास टी 1 था। अंत में रैंकिंग क्वालीफायर; और पॉल पहले था और मुझे जाने के लिए मिला। मैंने सभी को अपवित्र दिया, और चूंकि पॉल थोड़ा आगे है, मैं इसे स्वीकार करूंगा। लेकिन सभी योग्य हैं। – thursdaysgeek

उत्तर

11

इसे आज़माएं, 100% सुनिश्चित नहीं है कि वाक्यविन्यास सही है, लेकिन यह करीब है।

select 
    * 
from 
    (select 
     CON, 
     OWNER, 
     METHOD, 
     MATRIX, 
     RESULT, 
     COUNT, 
     RANK() OVER(PARTITION BY CON, OWNER, METHOD,MATRIX ORDER BY RESULT,COUNT DESC) as rnk 
    FROM #TempTable 
) a 
WHERE rnk = 1 
+0

@ शिवा, आप सही हैं, भूल गए हैं कि –

+0

मुझे कोई जानकारी नहीं है कि हम इस तरह से क्वेरी भी लिख सकते हैं। धन्यवाद यह मेरी कई समस्याओं को हल करता है। – Moons

2

एक आरडीबीएमएस विंडोइंग का समर्थन करता है कि में (एसक्यूएल सर्वर 2008 भी शामिल है, मेरा मानना ​​है कि)

SELECT CON, OWNER, METHOD, MATRIX, RESULT, `COUNT` 
FROM 
(SELECT CON, OWNER, METHOD, MATRIX, RESULT, `COUNT`, 
    RANK() OVER (PARTITION BY CON, OWNER, METHOD, MATRIX 
       ORDER BY RESULT DESC, `COUNT` DESC) AS rk 
    FROM temptable 
) AS s 
WHERE rk=1; 

ध्यान रखें कि आपके पाठ समूह में केवल एक नहीं-शून्य परिणाम निकलता है, लेकिन अपने उदाहरण नहीं है। यह संस्करण अधिकतम परिणाम का चयन करेगा जब तक कि सभी परिणाम समान न हों (उदा।, NULL) जब count टाईब्रेकर होगा। बीटीडब्लू, COUNT कॉलम नाम के रूप में सभी प्रकार के दुःख का कारण बन रहा है। यह संस्करण दोनों परिणाम और गिनती में संबंधों के मामले में कई पंक्तियों का भी चयन करता है। एक टाई है या नहीं, इस पर ध्यान दिए बिना केवल एक को पाने के लिए रैंक को row_number पर स्विच करें।

+0

ओह हाँ, मुझे COUNT नाम का उपयोग नहीं करना चाहिए था। मैं इसे अनामित कर रहा था, इसलिए हमारे पास हमारे सटीक नाम नहीं थे। – thursdaysgeek

0
select DetailID, field2, field3, field4, MasterID 
from table outer 
where DetailID= 
    (
     select max(DetailID) 
     From table inner 
     where outer.MasterID = inner.MasterID 
     group by MasterID 
    ) 

आप इसे देखने और शामिल होने के रूप में उपयोग कर सकते हैं।

संबंधित मुद्दे