एक कॉलम के लिए अलग और दूसरे कॉलम में किसी का चयन कैसे करें?


29

मुझे एक कॉलम के सभी अलग-अलग मूल्यों को खोजने के लिए एक SQL डेटाबेस को क्वेरी करने की आवश्यकता है और मुझे दूसरे कॉलम से एक मनमाना मूल्य चाहिए। उदाहरण के लिए, दो कॉलम, कुंजी और मान के साथ निम्न तालिका पर विचार करें:

key     value
===     =====
one     test
one     another
one     value
two     goes
two     here
two     also
three   example

मैं एक नमूना पंक्ति को वापस लेना चाहता हूं, जिसे प्रत्येक अलग-अलग कुंजी से मनमाने ढंग से चुना जाता है, शायद ये तीन पंक्तियां प्राप्त कर रहे हैं:

key     value
===     =====
one     test
two     goes
three   example

मैं SQL में ऐसी क्वेरी कैसे बना सकता हूं?


2
कौन सा DBMS (Oracle, SQL-Server, DB2, MySQL, Postgres)?
ypercube y

1
यह एक मालिकाना प्रणाली है।
विलियमके

जवाबों:


33

लिखने के लिए सबसे आसान क्वेरी MySQL (सख्त एएनएसआई सेटिंग्स के साथ नहीं) के लिए है। यह गैर-मानक निर्माण का उपयोग करता है:

SELECT key, value
FROM tableX
GROUP BY key ;

हाल के संस्करण (5.7 और 8.0+) में जहां सख्त सेटिंग्स और ONLY_FULL_GROUP_BYडिफ़ॉल्ट हैं, आप ANY_VALUE()5.7 में जोड़े गए फ़ंक्शन का उपयोग कर सकते हैं :

SELECT key, ANY_VALUE(value) AS value
FROM tableX
GROUP BY key ;

अन्य DBMS के लिए, जिसमें विंडो फ़ंक्शंस (जैसे Postgres, SQL-Server, Oracle, DB2) हैं, आप उन्हें इस तरह से उपयोग कर सकते हैं। लाभ यह है कि आप परिणाम में अन्य कॉलम भी चुन सकते हैं (इसके अलावा keyऔर value):

SELECT key, value
FROM tableX
    ( SELECT key, value,
             ROW_NUMBER() OVER (PARTITION BY key 
                                ORDER BY whatever)     --- ORDER BY NULL
               AS rn                                   --- for example
      FROM tableX
    ) tmp 
WHERE rn = 1 ;

उपरोक्त के पुराने संस्करणों और किसी अन्य DBMS के लिए, एक सामान्य तरीका जो लगभग हर जगह काम करता है। एक नुकसान यह है कि आप इस दृष्टिकोण के साथ अन्य कॉलम का चयन नहीं कर सकते हैं। एक और यह है कि कुछ डीबीएमएस (जैसे बिट, टेक्स्ट, ब्लब्स) में कुछ डेटाटाइप्स के साथ काम न करें MIN()और MAX()न करें:

SELECT key, MIN(value) AS value
FROM tableX
GROUP BY key ;

PostgreSQL का एक विशेष गैर-मानक DISTINCT ONऑपरेटर है जिसका उपयोग भी किया जा सकता है। वैकल्पिक ORDER BYयह चुनने के लिए है कि हर समूह से किस पंक्ति को चुना जाए:

SELECT DISTINCT ON (key) key, value
FROM tableX
-- ORDER BY key, <some_other_expressions> ;

2
@WilliamKF यदि "चुने हुए मनमाने ढंग से" से आपका मतलब है "बेतरतीब ढंग से चुना गया" तो बस ORDER BY whateverपरिणामों को रैंडम करने के लिए एक कॉल के साथ ypercube की क्वेरी में बदलें ।
लेह रिफ़ेल

1
@LeighRiffel यह यादृच्छिक नहीं होना चाहिए, कोई भी विकल्प, जैसा कि पहले वाला सामना करना पड़ा ठीक काम करता है।
विलियमके

3

MS-SQl सर्वर के लिए:

;with FinalDataset as
(
    select *,
        row_number() over(partition by key order by value) as rownum
    from YourOriginalTable
)
select
   key,
   value
from FinalDataset 
where rownum = 1

इसी तरह, आप अपने दूसरे परिणाम सेट के लिए पंक्तिबद्ध = 2 हो सकते हैं


2

स्वीकृत उत्तर के समान, लेकिन मिनट के बजाय () या अधिकतम () आप array_agg () का उपयोग कर सकते हैं

SELECT key, (array_agg(value))[1] AS value
FROM tableX
GROUP BY key ;

आप वैकल्पिक रूप से सरणी के अंदर मानों को उनमें से सबसे बड़ी या छोटी का चयन करने के लिए ऑर्डर कर सकते हैं:

SELECT key, (array_agg(value) ORDER BY value DESC)[1] AS value
FROM tableX
GROUP BY key ;

(PostgreSQL पर जाँच की गई)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.