2013-05-14 7 views
5

पर एक प्रश्न है, मुझे कोई सवाल है, मैं उच्चतम मूल्य कैसे प्राप्त कर सकता हूं, फिर सबसे कम मूल्य, फिर सबसे कम मूल्य एक टेबल से दूसरा उच्चतम मूल्य।उच्चतम, फिर सबसे छोटा, फिर दूसरा सबसे तेज़ मूल्य, और फिर दूसरा सबसे कम मूल्य और एक तालिका से

उदाहरण के लिए: तालिका में

Name  Value 
---------------------- 
Apple  2 
Pear   3 
Pineapple 6 
Mango  7 
Kiwi   1 

परिणाम इस तरह दिखना चाहिए:

Name   Value 
----------------------- 
Mango   7 
Kiwi   1 
Pineapple  6 
Apple   2 
Pear   3 

धन्यवाद!

+1

महान प्रश्न! करीबी मतदाताओं की उपस्थिति के लिए मेरी माफ़ी। आप किस डेटाबेस का उपयोग कर रहे हैं? (एसक्यूएल सर्वर, MySQL, PostgreSQL, ओरेकल, ...) – Andomar

+0

मैं SQL सर्वर – user1861065

उत्तर

10

मैं यह सोचते हैं रहा हूँ tsqlt टैग tsql होना चाहिए था, और आगे यह संकेत मिलता है कि यह है कि इस एसक्यूएल सर्वर के लिए है:

;with Numbered as (
    select Name,Value, 
     ROW_NUMBER() OVER (ORDER BY Value DESC) as rnDesc, 
     ROW_NUMBER() OVER (ORDER BY Value ASC) as rnAsc 
    from 
     @t 
), MixedNumbered as (
    select 
     Name,Value, 
     CASE WHEN rnDesc < rnAsc THEN rnDesc ELSE rnAsc END as rnFin, 
     rnAsc, 
     rnDesc 
    from 
     Numbered 
) 
select Name,Value from MixedNumbered order by rnFin,rnDesc 

यह जबकि सूची पर विचार पंक्ति संख्या का पता लगाकर काम करता है दोनों उच्चतम अनुसार क्रमबद्ध सबसे कम और निम्नतम से उच्चतम (Numbered में, rnDesc और rnAsc)। फिर हम इन आदेशों में से किसी एक पर विचार करते समय हासिल की गई सबसे कम पंक्ति संख्या लेते हैं (MixedNumbered, rnFin)।

इसके बाद, दो पंक्तियों को rnFin के बराबर 1, दो पंक्तियों के बराबर 2 के साथ उत्पन्न करना चाहिए, और इसी तरह; एन वें उच्चतम और एन वें सबसे कम पंक्तियों को जोड़कर जब तक हम सेट के बीच तक नहीं पहुंच जाते।

हम तो अंतिम परिणाम सेट सॉर्ट करने के लिए इस का उपयोग - लेकिन स्थिति मूल्यों पर विचार करके प्राप्त का उपयोग एक ही rnFin मूल्य के साथ उच्चतम करने वाली सबसे कम (rnDesc) पंक्तियों की प्रत्येक जोड़ी के बीच टाई ब्रेकर के रूप में हल कर। इसका मतलब है, प्रत्येक जोड़ी के लिए, उच्च मूल्यवान पंक्ति पहले दिखाई देगी।

परिणाम को रिवर्स करने के लिए (सबसे पहले सबसे पहले, फिर उच्चतम, दूसरा सबसे कम, दूसरा उच्चतम, आदि), हमें केवल ORDER BY क्लॉज को rnFin,rnAsc पर बदलने की आवश्यकता है।

+0

ग्रेट का उपयोग करता हूं! यह मेरे लिए ठीक काम करता है ... धन्यवाद !!! – user1861065

4

यह नंबर 2 को सबसे बड़ी पंक्ति, 3 सबसे छोटे, 4 से दूसरे सबसे बड़े, और इसी तरह से असाइन करता है।

select * 
from (
     select 1 + 2 * row_number() over (order by Value asc) as rnAsc 
     ,  2 * row_number() over (order by Value desc) as rnDesc 
     ,  t1.* 
     from Table1 t1 
     ) SubQueryAlias 
order by 
     case 
     when rnDesc < rnAsc then rnDesc 
     else rnAsc 
     end 

Example at SQL Fiddle.

0

एक बड़ा सवाल! की जांच करें मेरी कोशिश:

SELECT Name,Value 
FROM(
    SELECT *, MAX(Rnum) OVER() mx, MAX(Rnum) OVER()/2.0 hf FROM(
     SELECT *, ROW_NUMBER() OVER(ORDER BY value DESC) Rnum From @tbl 
    )x 
)xx 
ORDER BY CASE WHEN Rnum-hf<=0 THEN Rnum ELSE mx-Rnum+1 END, Rnum 
संबंधित मुद्दे