2011-12-05 13 views
24

एक रिकॉर्ड का चयन एसक्यूएल सर्वर 2008 में मैं एक मेज ग्राहकों कि के रूप में दो स्तंभ हैं है:साथ मैक्स मूल्य

आईडी, संतुलन

मैं क्वेरी कि आईडी का चयन करता है कैसे लिख सकते हैं जिस ग्राहक का अधिकतम शेषराशि है, सबसे प्रभावी तरीके से "?

विकल्प 1: ORDER BY BALANCE and SELECT TOP(1) -> बहुत अधिक लागत।

विकल्प 2: सबसे पहले Get MAX amount, फिर where clause में राशि का उपयोग करने वाली एक और क्वेरी करें -> बहुत अधिक लागत और विश्वसनीय प्रतीत नहीं होती है।

+4

यदि आप बैलेंस में एक गैर क्लस्टर इंडेक्स जोड़ते हैं तो आपको यह पता लगाना चाहिए कि विकल्प 1 बहुत तेज़ है। – StuartLC

+0

क्या आप टाई की स्थिति में सभी आईडी जानना चाहते हैं? ऐसा लगता है कि आप टाई की स्थिति में यादृच्छिक एक की तलाश में हैं। – Gary

उत्तर

31

नोट: इस उत्तर का गलत संशोधन संपादित किया गया था। कृपया सभी उत्तरों की समीक्षा करें।

WHERE खंड में एक उप-चयन सभी पंक्तियों पर समेकित BALANCE को पुनः प्राप्त करने के लिए खंड। यदि एकाधिक ID मान उस शेष राशि को साझा करते हैं, तो सभी वापस लौटाए जाएंगे।

SELECT 
    ID, 
    BALANCE 
FROM CUSTOMERS 
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS) 
+1

आईएम कोई एसक्यूएल विशेषज्ञ नहीं है लेकिन समूह नहीं है अपनी लागत है ?? – Baz1nga

+0

@ Baz1nga - आप क्लॉज द्वारा समूह के बिना अतिरिक्त कॉलम के साथ कुल कार्यों पर काम नहीं कर सकते हैं।सब कुछ एक लागत है लेकिन असली सवाल क्या है? – JonH

+4

कॉलम बैलेंस हैविंग क्लॉज में अमान्य है क्योंकि यह या तो कुल कार्य या ग्रुप बाय क्लॉज में निहित नहीं है। –

6

आपकी लागत का क्या मतलब है? बहुत ज्यादा क्या?

SELECT MAX(Balance) AS MaxBalance, CustomerID FROM CUSTOMERS GROUP BY CustomerID

अपनी मेज समुचित रूप से सूचीबद्ध है (शेष) और वहाँ पी पर एक सूचकांक बात होनी ही थी की तुलना में मुझे यकीन है कि क्या आप लागत के बारे में बहुत ज्यादा मतलब या नहीं कर रहा हूँ अविश्वसनीय लगता है? आप जिस योग का उपयोग कर रहे हैं और इसे करने के लिए कह रहे हैं, उसके बारे में अविश्वसनीय कुछ भी नहीं है। इस मामले में, MAX() ठीक वही करता है जो आप इसे करने के लिए कहते हैं - इसके बारे में कुछ भी जादुई नहीं है।

MAX() पर एक नज़र डालें और यदि आप फ़िल्टर करना चाहते हैं तो इसे HAVING खंड का उपयोग करें।

2

कहें, उपयोगकर्ता के लिए, प्रत्येक तिथि के लिए संशोधन होता है। निम्नलिखित प्रत्येक कर्मचारी के लिए प्रत्येक तारीख के अधिकतम संशोधन के लिए रिकॉर्ड उठाएगा।

select job, adate, rev, usr, typ 
from tbl 
where exists ( select 1 from (select usr, adate, max(rev) as max_rev 
           from tbl 
           group by usr, adate 
          ) as cond 
       where tbl.usr=cond.usr 
       and tbl.adate =cond.adate 
       and tbl.rev =cond.max_rev 
      ) 
order by adate, job, usr 
1

क्वेरी answered by sandip giri सही जवाब है, यहाँ एक ऐसी ही उदाहरण अधिकतम आईडी (PresupuestoEtapaActividadHistoricoId), के बाद अधिकतम मूल्य (बेस) की गणना

select * 
from (
     select PEAA.PresupuestoEtapaActividadId, 
       PEAH.PresupuestoEtapaActividadHistoricoId,    
      sum(PEAA.ValorTotalDesperdicioBase) AS Base, 
      sum(PEAA.ValorTotalDesperdicioEjecucion) AS Ejecucion 
     from hgc.PresupuestoActividadAnalisis AS PEAA 
     inner join hgc.PresupuestoEtapaActividad AS PEA ON PEAA.PresupuestoEtapaActividadId=PEA.PresupuestoEtapaActividadId 
    inner join hgc.PresupuestoEtapaActividadHistorico AS PEAH ON PEA.PresupuestoEtapaActividadId=PEAH.PresupuestoEtapaActividadId               
    GROUP BY PEAH.PresupuestoEtapaActividadHistoricoId, PEAA.PresupuestoEtapaActividadId 
) as t 
where exists (select 1 
      from ( select MAX(PEAH.PresupuestoEtapaActividadHistoricoId) AS PresupuestoEtapaActividadHistoricoId                  
        from hgc.PresupuestoEtapaActividadHistorico AS PEAH      
        GROUP BY PEAH.PresupuestoEtapaActividadId 
       ) as ti 
      where t.PresupuestoEtapaActividadHistoricoId=ti.PresupuestoEtapaActividadHistoricoId 
     ) 
1

यहाँ एक विकल्प है यदि आप कई रिकॉर्ड हो रही थी प्रत्येक ग्राहक के लिए और प्रत्येक के लिए नवीनतम शेष राशि की तलाश कर रहे हैं (कहें कि वे दिनांकित रिकॉर्ड हैं):

SELECT ID, BALANCE FROM (
    SELECT ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DateModified DESC) as RowNum, ID, BALANCE 
    FROM CUSTOMERS 
) C 
WHERE RowNum = 1 
0

यह प्राप्त करने का एक आसान तरीका है अधिकतम शेष राशि वाले ग्राहक:

SELECT 
    ID, 
    BALANCE 
FROM CUSTOMERS 
WHERE BALANCE = (SELECT MAX(BALANCE) FROM CUSTOMERS) 
संबंधित मुद्दे