2008-10-22 11 views
5

मैं SQL सर्वर 2005 के लिए एक प्रश्न लिखने की कोशिश कर रहा हूं लेकिन मुझे यह पता नहीं चल सकता कि इसे कैसे किया जाए। मैं निम्नलिखित क्षेत्रों के साथ एक मेज है:सेमी-ट्रिकी एसक्यूएल क्वेरी

MessageId पूर्णांक
CategoryID पूर्णांक
प्राथमिकता tinyint
MessageText NVARCHAR (मैक्स)

मैं प्रत्येक पंक्ति है कि के लिए एक प्रश्न है कि वापस आ जाएगी की जरूरत है * एक श्रेणी के भीतर सर्वोच्च प्राथमिकता।

MessageId, CategoryID, प्राथमिकता, MessageText
1, 100, 1, # 1234 एरर आ
2, 100, 2, त्रुटि # 243 हुई
3: उदाहरण के लिए, अगर मैं निम्न डेटा था , 100, 3, त्रुटि # 976 हुई
4, 200, 4, त्रुटि # 194 हुई
5, 200, 1, त्रुटि # 736 हुई
6, 300, 3, # 54 त्रुटि
7, 300 हुई , 2, त्रुटि # 888 हुई

तो परिणाम होगा:

MessageId, CategoryID, प्राथमिकता, MessageText
3, 100, 3, # 976 एरर आ
4, 200, 4, # 194 एरर आ
6, 300, 3, त्रुटि # 54 हुई

ध्यान दें कि यह प्रति पंक्ति एक पंक्ति लौटाता है, और यह वह पंक्ति है जिसकी उस श्रेणी के लिए सर्वोच्च प्राथमिकता थी।

क्या कोई मुझे बता सकता है कि मैं यह प्रश्न कैसे लिख सकता हूं?

+0

आप Oracle में विश्लेषणात्मक कार्यों का उपयोग कर इसे काफी आसान लिख सकते हैं। :) – TheSoftwareJedi

+0

या SQL सर्वर में विश्लेषणात्मक कार्यों का उपयोग करना और ओरेकल को बंदरगाह नहीं करना है। – cfeduke

उत्तर

6

सत्यापित: (IMO) को पढ़ने के लिए

SELECT 
    highest_priority_messages.* 
FROM 
(
    SELECT 
    m.MessageID 
    , m.CategoryID 
    , m.Priority 
    , m.MessageText 
    , Rank() OVER 
     (PARTITION BY m.CategoryID ORDER BY m.Priority DESC) AS p_rank 
    FROM [Message] m 
    GROUP BY 
     m.CategoryID 
     , m.Priority 
     , m.MessageID 
     , m.MessageText 
) highest_priority_messages 
WHERE 
    p_rank = 1 
+0

आप एक निर्मितडेट भी जोड़ना चाहते हैं और ऑर्डर करने के लिए समीकरण में यह आंकड़ा चाहते हैं। – cfeduke

+0

क्या आप वाकई रैंक() का उपयोग किए बिना भाग का उपयोग करने का कोई तरीका नहीं हैं? – skb

+0

आप अधिकतम (एम। प्राथमिकता) (एम। श्रेणीबद्धता द्वारा विभाजित) एएस मैक्सप्रोरिटी के रूप में कर सकते हैं, लेकिन फिर WHERE को प्राथमिकता को अधिकतम प्राथमिकता से तुलना करना होगा। यह इस बात पर भी निर्भर करता है कि आप शीर्ष प्राथमिकता के गुणक चाहते हैं या नहीं। –

1

मुझे विश्वास है कि यह काम करना चाहिए, तालिका नाम संदेश

SELECT 
    M.MessageId, 
    M.CategoryId, 
    M.Priority, 
    M.MessageText 
FROM 
(
    SELECT 
     CategoryId, 
     MAX(Priority) AS Priority 
    FROM Messages 
    GROUP BY CategoryId 
) AS MaxValues 
    INNER JOIN Messages M 
     ON (MaxValues.CategoryId = M.CategoryId 
       AND MaxValues.Priority = M.Priority) 

नोट के रूप में ग्रहण

केवल "पकड़ लिया" इस विधि में है कि आप एक से अधिक अधिकतम प्राथमिकता दी जाती है, तो ..

0
SELECT 
    Messages.MessageID 
    , Messages.CategoryID 
    , Messages.Priority 
    , Messages. MessageText 
FROM 
    Messages 
    INNER JOIN 
    (
     SELECT 
      CategoryID 
      , MAX(Priority) AS Priority 
     FROM 
      Messages 
     GROUP BY 
      CategoryID 
    ) AS MaxResults 
    ON 
     (
      Messages.CategoryID = MaxResults.CategoryID 
      AND 
      Messages.Priority = MaxResults.Priority 
     ) 

ऐसा लगता है कि यह मूल रूप से वही उत्तर है जो उसी चेतावनी के साथ दिया गया है।

हालांकि यह बल्ले से ठीक काम करेगा।

+0

वाह, मैंने ध्यान नहीं दिया कि मेरे उपनाम को हटा दिया गया था .... –

0

यह छोटा और आसान है।

select ms.* 
from 
    messages ms 
,(
    select ms1.categoryid, max(ms1.priority) as max_priority 
    from messages ms1 
    group by ms1.categoryid 
) tmp 
where ms.categoryid = tmp.categoryid 
    and ms.priority = tmp.max_priority; 
1

आप सबक्वेरी के सभी बिना यह करने के लिए करना चाहते हैं:

SELECT 
    MessageID, 
    CategoryID, 
    Priority, 
    MessageText 
FROM 
    dbo.Messages M1 
LEFT OUTER JOIN dbo.Messages M2 ON 
    M2.CategoryID = M1.CategoryID AND 
    M2.Priority > M1.Priority 
WHERE 
    M2.MessageID IS NULL 

आप आप कैसे संबंधों हैंडल करना चाहते हैं पर निर्भर करता है क्वेरी समायोजित करने के लिए हो सकता है। आपके पास ऐसा कोई उदाहरण नहीं था, इसलिए मुझे यकीन नहीं था।

0

मैं काफी पर्याप्त उच्च रैंक नहीं कर रहा हूँ (अभी तक) एक टिप्पणी पोस्ट करने, इसलिए मैं के cfeduke का हल जोड़ना चाहते हैं:

SELECT 
    highest_priority_messages.* 
FROM 
(
    SELECT 
    m.MessageID 
    , m.CategoryID 
    , m.Priority 
    , m.MessageText 
    , Rank() OVER 
     (PARTITION BY m.CategoryID ORDER BY m.Priority DESC, m.MessageID DESC) AS p_rank 
    FROM [Message] m 
    GROUP BY 
     m.CategoryID 
     , m.Priority 
     , m.MessageID 
     , m.MessageText 
) highest_priority_messages 
WHERE 
    p_rank = 1 

आपने प्रधान 3 के साथ एक और CategoryID 100 संदेश जोड़ते हैं, मूल समाधान दो पंक्तियों को वापस लाएगा, एक और ऑर्डर स्थिति जोड़कर हम दो वस्तुओं की रैंकिंग को खत्म कर देंगे।

यहां परीक्षण करने के लिए डाली गई पंक्ति की एक प्रति है।

insert into [Message] (MessageID, CategoryID, Priority, MessageText) 
select 8, 100, 3, 'Error #976-2 occurred' 
1
select distinct query1.* from 

(select categoryId,msgText,max(priorityId) as MAX_PRIORITY 
from message 
    group by categoryId,msgText 
order by categoryId 
) query1, 


(select categoryId,max(priorityId) as MAX_PRIORITY 
from message 
    group by categoryId 
order by categoryId 
) query2 

where query1.MAX_PRIORITY = query2.MAX_PRIORITY 

order by query1.categoryId 
0
SELECT DISTINCT CategoryId,PS.Priority,MessageID,MessageText 
FROM Priority_Scene PS 
JOIN (SELECT MAX(Priority) AS Priority FROM Priority_Scene GROUP BY CategoryId) A 
ON A.Priority = PS.Priority 
+1

यदि समान श्रेणी में समानता और उच्चतम स्तर पर दो प्राथमिकताएं हैं तो यह भी काम करेगी – Kamy

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