2009-05-26 20 views
6

**** अद्यतन में अधिकतम मूल्य के आधार पर वर्गीकृत क्वेरी: **एसक्यूएल सर्वर स्तंभ

रैंक() विभाजन वाक्य रचना से अधिक एमएस एसक्यूएल सर्वर में उपलब्ध का उपयोग कर 2005 वास्तव में, यह सही दिशा में मुझे इंगित करता है (या शायद मुझे "मैं" लिखना चाहिए) मुझे कोड में पंक्तियों की गणना करने के बिना मुझे आवश्यक परिणाम देने में असमर्थ है।

उदाहरण के लिए, अगर हम टॉप चयन (1) रैंक के, मैं केवल एक मान, मिल अर्थात्।, स्लॉट 1. अगर मैं मैक्स() का उपयोग, तो मैं प्रत्येक स्लॉट के लिए शीर्ष क्रम मूल्य प्राप्त .. जो मेरे मामले में काम नहीं करता है, क्योंकि यदि स्लॉट 2 का शीर्ष मान शून्य है, लेकिन यह MAX मान के बगल में है, तो वह खाली है, जो मैं चाहता हूं।

तो, एक पूरी तरह से T-SQL समाधान खोजने में असमर्थ है, मैं एसक्यूएल में और उसके बाद ग्राहक के पक्ष कोड में परिणाम की गणना जितना संभव हो उतना छानने का सहारा लिया गया है।

मूल:

मैं गया है advanced T-SQL books, StackOverflow समाप्त होता रहा है और कैसे या तो इन्हीं का उपयोग करके या विश्लेषणात्मक कार्यों का उपयोग करके इस प्रश्न को संभालने के लिए पता लगाने की कोशिश गूगल। अब तक, मैंने सही संयोजन पर नहीं मारा है।

मेरे पास शेड्यूल हैं (उच्च मूल्य, अधिक प्राथमिकता)। प्रत्येक शेड्यूल में फाइलों के साथ क्रमांकित स्लॉट की एक निश्चित संख्या की प्लेलिस्ट होती है।

मुझे क्या करना है, सभी शेड्यूल और उनकी संबंधित प्लेलिस्ट को लाइन करना है, और प्रत्येक स्लॉट के लिए, उच्चतम रैंकिंग मान वाले शेड्यूल से फ़ाइल को पकड़ें।

इसलिए, अगर मैं प्लेलिस्ट और कार्यक्रम है, इसलिए जैसे Schedule.Rank DESC द्वारा आदेश दिया जो में शामिल होने के साथ एक विशिष्ट ग्राहक के लिए एक प्रश्न था:

PlaylistId Schedule.Rank SlotNumber FileId 
100    100    1   1001 
100    100    2   NULL 
100    100    3   NULL 
200    80    1   1101 
200    80    2   NULL 
200    80    3   NULL 
300    60    1   1201 
300    60    2   NULL 
300    60    3   2202 
400    20    1   1301 
400    20    2   2301 
400    20    3   NULL 

इस से, मैं FileId खोजने की जरूरत है मैक्स रैंकिंग पंक्ति प्रति स्लॉटनंबर के लिए:

SlotNumber FileId Schedule.Rank 
1    1001   100 
2    2301   20 
3    2202   60 

यह कैसे करें इस पर कोई विचार है?

नीचे तालिका परिभाषाएं:

CREATE TABLE dbo.Playlists(
    id int NOT NULL) 

CREATE TABLE dbo.Customers(
    id int NOT NULL, 
    name nchar(10) NULL) 

CREATE TABLE dbo.Schedules(
    id int NOT NULL, 
    rank int NOT NULL, 
    playlistid int NULL, 
    customerid int NULL) 

CREATE TABLE dbo.PlaylistSlots(
    id int NOT NULL, 
    slotnumber int NOT NULL, 
    playlistid int NULL, 
    fileid int NULL) 
+0

+1 सिर्फ इसलिए कि कुछ समय में एक उचित प्रश्न पूछने के लिए बहुत अच्छा है, सभी प्रासंगिक तालिकाओं और सभी के साथ - धन्यवाद !!! -) –

+0

बीटीडब्ल्यू, पिवट के पास इसके साथ कुछ करने के लिए कुछ भी नहीं है (वह है चीजों को "फ़्लिपिंग" के बारे में, इसलिए पंक्ति मान कॉलम बन जाते हैं) इसलिए मैं तदनुसार संपादन कर रहा हूं। –

+0

मुझे यकीन नहीं है कि जिस पुस्तक का आप उल्लेख कर रहे हैं वह अच्छा है। इन्हें आजमाएं: http://www.sql.co.il/ –

उत्तर

4
SELECT slotnumber, fileid, rank 
FROM 
(
    SELECT slotnumber, fileid, Schedules.rank, RANK() OVER (PARTITION BY slotnumber ORDER BY Schedules.rank DESC) as rankfunc 
    FROM Schedules 
    INNER JOIN PlaylistSlots ON Schedules.playlistid = PlaylistSlots.playlistid 
) tmp 
WHERE rankfunc = 1 
+0

जबकि यह उत्तर बिल्कुल सही नहीं है (मानदंड में खिड़की वाला कार्य एक त्रुटि फेंकता है), इस उत्तर की जड़ें मुझे मेरे कार्यान्वयन-विशिष्ट उत्तर के लिए प्रेरित करती हैं। –

+0

तो क्या आप वास्तव में सही संस्करण पोस्ट कर सकते हैं (या मुझे बताएं कि मेरा संपादन कैसे करें)? जैसा कि मैंने @ मिच के जवाब पर एक टिप्पणी में उल्लेख किया है, मैं इसका परीक्षण नहीं कर सका, इसलिए कुछ (उम्मीद है कि मामूली! -) त्रुटि में क्रिप्ट हो सकता है - धन्यवाद! –

+0

अभी भी समाधान पर काम कर रहा है, लेकिन विंडो किए गए फ़ंक्शन समस्या को ठीक करने के लिए, आप पूरे चयन को व्युत्पन्न तालिका में लपेट सकते हैं। मुझे अभी भी नतीजे नहीं मिल रहे हैं, लेकिन मैं सही दिशा में जा रहा हूं। जब मेरे पास एक समाधान समाधान है, तो मैं मूल प्रश्न को पूर्ण उत्तर से संपादित कर दूंगा। –

1

आप एसक्यूएल सर्वर के (2005 के बाद) PARTITION and RANK सुविधाओं को देखा है?

+0

मैंने एसओ और एमएसडीएन दस्तावेज़ों के बारे में पढ़ा है .... लेकिन इस बिंदु पर सफलतापूर्वक उनका उपयोग करने में सक्षम नहीं हैं। –

+0

वे आपके द्वारा बताई गई समस्या के लिए आदर्श हैं। –

+0

हाँ - मैं विभाजन के आधार पर संक्षिप्त कोड टाइप करने में व्यस्त था, भले ही आपका उत्तर आया, @ मिच (उम्मीद है कि यह सही है, परीक्षण करने का कोई समय नहीं है, क्षमा करें)। तो, एक सामान्य एसओ मुद्दे के रूप में, सबसे अच्छा क्या है - टोड को मछली के रूप में सिखाएं जैसे आप कर रहे हैं, या उसे एक मछली देने की कोशिश कर रहे हैं जैसा मैं कर रहा हूं? एक अशिष्ट सवाल नहीं, मैं यहां बहुत नया हूं और पुराने-टाइमर क्या देखकर एसओ की शैली सीखने की कोशिश कर रहा हूं, लेकिन ऐसा लगता है कि दोनों दृष्टिकोण काफी लोकप्रिय हैं - किसी भी प्रतिक्रिया के लिए टीएक्स! –

0
 

select SlotNumber, FileId, ScheduleRank 
FROM intermediateTable a, 
(
    SELECT SlotNumber, Max(Schedule.Rank) as MaxRank 
    FROM intermediateTable O 
    WHERE FileId is not null GROUP BY SlotNumber) b 
WHERE b.SlotNumber = a.SlotNumber and b.MaxRank = a.Rank 
 

इस क्वेरी मध्यवर्ती उत्पादन अंतिम आउटपुट के निर्माण के लिए उपयोग करता है।
क्या इससे मदद मिलती है?

+0

आईएमएचओ यह वास्तव में महत्वपूर्ण है उन दृष्टिकोणों को भी दिखाएं जो अन्य एसक्यूएल इंजन w/o रैंक और विभाजन सुविधाओं के लिए पोर्टेबल हैं, जैसा कि आपका होगा, लेकिन मुझे नहीं लगता कि इंटरमीडिएटटेबल कहां बनाया गया है या कैसे: क्या आप पूर्णता के लिए वर्ष का उत्तर संपादित कर सकते हैं? tx! –

+0

इंटरमीडिएट तालिका ओपी द्वारा दी गई तालिका 1 है – shahkalpesh

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