2008-10-30 25 views
14

जोड़ा गया: SQL Server 2000 और 2005 के साथ कार्य करना, इसलिए दोनों पर काम करना है। साथ ही, value_rk एक संख्या/पूर्णांक नहीं है (त्रुटि: ऑपरेटर डेटा प्रकार अद्वितीय पहचानकर्ता मिनी ऑपरेटर के लिए अमान्य है)एक कॉलम का चयन करें DISTINCT SQL

क्या एक कॉलम "DISTINCT" मैच करने का कोई तरीका है जब मुझे अन्य कॉलम लौटाए जाने की परवाह नहीं है ? उदाहरण:

**Table** 
Value A, Value L, Value P 
Value A, Value Q, Value Z 

मुझे पहले पंक्तियों (मूल्य ए) के आधार पर इन पंक्तियों में से केवल एक को वापस करने की आवश्यकता है। मुझे अभी भी दूसरे और तीसरे कॉलम के परिणाम की आवश्यकता है (दूसरा वास्तव में बोर्ड के सभी हिस्सों से मेल खाता है, लेकिन तीसरा एक अनूठी कुंजी है, जिसे मुझे कम से कम एक की आवश्यकता है)। वहाँ है कि में एक सरल समाधान का है, इसलिए यदि

SELECT value, attribute_definition_id, value_rk 
FROM attribute_values 
WHERE value IN (
    SELECT value, max(value_rk) 
    FROM attribute_values 
) 
ORDER BY attribute_definition_id 

मैं ColdFusion में काम कर रहा हूँ मैं भी कि के लिए खुला रहा हूँ:

यहाँ मैं अब तक क्या आपके पास यह है, हालांकि यह स्पष्ट रूप से काम नहीं करता है । मैं पहले कॉलम "मान" को सीमित या "समूह" द्वारा सीमित करने की कोशिश कर रहा हूं। value_rk मेरी बड़ी समस्या है क्योंकि प्रत्येक मान अद्वितीय है लेकिन मुझे केवल एक की आवश्यकता है।

नोट: value_rk एक नंबर नहीं है, इसलिए इस काम नहीं करता है

अद्यतन: मैं एक काम कर संस्करण मिल गया है, यह शायद काफ़ी एक शुद्ध SQL संस्करण की तुलना में धीमी है, लेकिन ईमानदारी से कुछ भी इस बिंदु पर काम कर कुछ भी नहीं है। यह परिणाम पहली क्वेरी से लेता है, एक दूसरे प्रश्न को इसके परिणामों को सीमित करने के अलावा, और मेल खाने वाले मान के लिए मिलान करने वाले value_rk को पकड़ता है। इस प्रकार:

<cfquery name="queryBaseValues" datasource="XXX" timeout="999"> 
    SELECT DISTINCT value, attribute_definition_id 
    FROM attribute_values 
    ORDER BY attribute_definition_id 
</cfquery> 

<cfoutput query="queryBaseValues"> 
    <cfquery name="queryRKValue" datasource="XXX"> 
     SELECT TOP 1 value_rk 
     FROM attribute_values 
     WHERE value = '#queryBaseValues.value#' 
    </cfquery> 
    <cfset resourceKey = queryRKValue.value_rk> 
    ... 

तो आपके पास यह है, कोल्डफ्यूजन में एक कॉलम को स्पष्ट रूप से चुनकर। कोई शुद्ध SQL सर्वर 2000/2005 सुझाव अभी भी बहुत स्वागत है :)

+0

क्या आप अपनी जरूरतों को स्पष्ट कर सकते हैं? कोई पंक्ति, लेकिन मूल्य प्रति केवल एक पंक्ति? उस मान के साथ पंक्ति जिसमें अधिकतम value_rk है? मुझे यकीन नहीं है कि मैं समझता हूं कि आप यहां क्या कर रहे हैं। – tvanfosson

+0

> नोट: value_rk कोई संख्या नहीं है, इसलिए यह काम नहीं करता है। इसका कोई संबंध नहीं है कि आपकी क्वेरी क्यों विफल हो जाती है। आपने आरडीबीएमएस का उपयोग नहीं किया है जिसका उपयोग आप कर रहे हैं लेकिन ओरेकल में आप वर्ण कॉलम पर MAX का उपयोग कर सकते हैं। –

+0

एमएस एसक्यूएल गैर-न्यूमेरिक कॉलम पर MAX का भी उपयोग कर सकता है। – BradC

उत्तर

11

इस काम हो सकता है:

SELECT DISTINCT a.value, a.attribute_definition_id, 
    (SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk 
FROM attribute_values as a 
ORDER BY attribute_definition_id 

.. परीक्षण नहीं किया।

+1

मेरे लिए एमएस एसक्यूएल पर काम करता है । – Steffen

1
SELECT value, attribute_definition_id, value_rk 
FROM attribute_values 
WHERE value, value_rk IN (
     SELECT value, max(value_rk) 
     FROM attribute_values 
     GROUP BY value 
) 
ORDER BY attribute_definition_id 

परीक्षण नहीं किया गया!

+0

मेरी गलती, मैंने स्वयं परीक्षण किए बिना पोस्ट किया, मैंने अपडेट किया कि value_rk एक संख्या नहीं है (अधिकतम/मिनट जीता ' टी इस पर काम नहीं करते) – Organiccat

+0

अधिकतम/मिनट SQL2005 में वर्चर्स मानों पर काम करेगा। आप किस डीबी का उपयोग कर रहे हैं? – BradC

+0

वास्तव में 2005 पर परीक्षण कर रहा है, लेकिन उत्पादन सर्वर 2000 है। मुझे उस पर न्यूनतम/अधिकतम चलाने की कोशिश करते समय डेटा प्रकार की मिलान त्रुटि मिलती है (ओपी पोस्ट के शीर्ष पर जोड़ा गया)। – Organiccat

2

क्या आप यह देख रहे हैं?

SELECT value, attribute_definition_id, value_rk 
FROM attribute_values av1 
WHERE value_rk IN (
     SELECT max(value_rk) 
     FROM attribute_values av2 
     WHERE av2.value = av1.value 
) 
ORDER BY attribute_definition_id 

यदि value_rk अद्वितीय है, तो यह काम करना चाहिए।

8
SELECT a1.value, a1.attribute_definition_id, a1.value_rk 
FROM attribute_values AS a1 
    LEFT OUTER JOIN attribute_values AS a2 
    ON (a1.value = a2.value AND a1.value_rk < a2.value_rk) 
WHERE a2.value IS NULL 
ORDER BY a1.attribute_definition_id; 

दूसरे शब्दों में, पंक्ति a1 जिसके लिए कोई पंक्ति a2 ही value और एक अधिक से अधिक value_rk के साथ मौजूद हैं।

SELECT value, attribute_definition_id, value_rk 
FROM attribute_values 
GROUP BY value 
ORDER BY attribute_definition_id; 

फिर से, मैं असली यकीन है कि जो स्तंभ यह आप सीमित करने के लिए कोशिश कर रहे हैं नहीं कर रहा हूँ:

+0

यह एक अच्छा समाधान है क्योंकि यह अधिकांश (सभी?) आरडीबीएमएस के साथ काम करेगा। मुझे पोस्टग्रेएसक्यूएल के 'डिस्टिंट ऑन' द्वारा खराब कर दिया गया है। टाइप करने के लिए आसान है, लेकिन गैर मानक और एसक्यूएल सर्वर में लागू नहीं किया गया है। – Sam

1

मैं नहीं यकीन है कि अगर मैं पूरी तरह से अपने सेट अप को समझने के इस काम की तरह कुछ कर रहा हूँ, लेकिन , या आप इसे सीमित करना चाहते हैं।

8

यह पोस्टग्रेएसक्यूएल के लिए काम करना चाहिए, मुझे नहीं पता कि आप कौन सी डीबीएमएस का उपयोग करते हैं।

SELECT DISTINCT ON (value) 
    value, 
    attribute_definition_id, 
    value_rk 
FROM 
    attribute_values 
ORDER BY 
    value, 
    attribute_definition_id 

PostgreSQL Docs

+4

यहां एकमात्र समस्या यह है कि एमएस-एसक्यूएल को सभी चयनित कॉलम में केवल DISTINCT पर DISTINCT नहीं पता है ... –

2

ठीक है, मेरी मान्यताओं है:

स्टैंडर्ड एसक्यूएल सर्वर

value_rk एक अंकीय मान नहीं है, लेकिन मूल्य और attribute_definition_id सांख्यिक हैं।

SELECT value_rk, MIN(value) as value, MIN(attribute_definition_id) as attribute_definition_id 
FROM attribute_values 
GROUP BY value_rk 
ORDER BY MIN(attribute_definition_id) 

यदि इनमें से कोई फ़ील्ड संख्यात्मक नहीं है, तो इसे और अधिक विचार की आवश्यकता होगी - कृपया हमें बताएं।

0

मुझे पसंद से कम सुरुचिपूर्ण ---- यह अनिवार्य रूप से आप कर रहे हैं, केवल शुद्ध एसक्यूएल में --- लेकिन यह काम करता है और सब कुछ SQL में किया जा सकता है।

 
DECLARE @mytable TABLE(mykey NVARCHAR(512), myVal NVARCHAR(512)) 

DECLARE @keyVal NVARCHAR(512) 
DECLARE @depVal NVARCHAR(512) 
DECLARE myCursor CURSOR for 
    SELECT DISTINCT(value) FROM attribute_values 
OPEN myCursor 
FETCH NEXT FROM myCursor INTO @keyVal 
WHILE @@FETCH_STATUS=0 
    BEGIN 
    SET @depVal = (SELECT TOP 1 attribute_definition_id FROM attribute_values WHERE [email protected] ORDER BY attribute_definition_id) 
    INSERT INTO @mytable (mykey, myVal) VALUES (@keyVal, @depVal) 
    FETCH NEXT FROM myCursor INTO @keyVal 
    END 
DEALLOCATE myCursor 

SELECT * FROM @mytable 

आप इस विधि का उपयोग कर एक depVal2 और अन्य जोड़ सकते हैं।

2

आप तालिका वैरिएबल का उपयोग कर के लिए खुले हैं, तो आप यह सब इस तरह एक एकल डाटाबेस कॉल के भीतर रख सकता है:

DECLARE @attribute_values TABLE (value int, attribute_definition_id int, value_rk uniqueidentifier) 

INSERT INTO @attribute_values (value) 
SELECT DISTINCT value FROM attribute_values 

UPDATE @attribute_values 
SET attribute_definition_id = av2.attribute_definition_id, 
    value_rk = av2.value_rk 
FROM @attribute_values av1 
INNER JOIN attribute_values av2 ON av1.value = av2.value 

SELECT value, attribute_definition_id, value_rk FROM @attribute_values 

अनिवार्य रूप से आप 'मूल्य का अनन्य मानों से भर तालिका के साथ एक सीमित recordset पैदा कर रहे ', और मुख्य तालिका से केवल एक मैचों का उपयोग करके SQL सर्वर को अंतराल में भरने देना।

जोड़ने के लिए संपादित: यह वाक्यविन्यास सिर्फ cfquery के भीतर काम करता है।

0

मुझे लगता है कि

SELECT DISTINCT a.value, a.attribute_definition_id, 
(SELECT TOP 1 value_rk FROM attribute_values WHERE value = a.value) as value_rk 
FROM attribute_values as a 
ORDER BY attribute_definition_id 

काम किया

0

जॉन फियाला द्वारा बताया गया है, एसक्यूएल सर्वर में विहित जवाब जब आप एक सबसेट पर एक "विशिष्ट" कार्रवाई करने के लिए चाहते हैं खंड द्वारा एक समूह का उपयोग करने के लिए है कॉलम का यह सही कैनोलिक जवाब क्यों है? खैर, आप उन स्तंभों को खींचना चाहते हैं जो आपके "विशिष्ट" समूह का हिस्सा नहीं हैं। इन सहायक कॉलमों के लिए आप वास्तव में कौन सी पंक्तियां खींचना चाहते हैं? खंड द्वारा समूह का उपयोग करके और इन सहायक कॉलम के लिए कुल कार्यों को परिभाषित करने से आपकी क्वेरी इस अर्थ में अच्छी तरह से व्यवहार करती है कि अब आप जानते हैं कि इन सहायक कॉलम कैसे प्राप्त किए जाते हैं। इस लेख में अधिक विवरण देता है: इसके अलावा

http://weblogs.sqlteam.com/jeffs/archive/2007/10/12/sql-distinct-group-by.aspx

SELECT value_rk, MIN(value) as value, 
MIN(attribute_definition_id) as attribute_definition_id 
FROM attribute_values 
GROUP BY value_rk 

, यह ध्यान देने योग्य है कि पाठ और कई अन्य डेटा प्रकार है कि संख्यात्मक मान नहीं हैं पर MIN और MAX के काम करते हैं।

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