मैं यह सोचते हैं रहा हूँ 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
पर बदलने की आवश्यकता है।
स्रोत
2013-05-14 13:25:57
महान प्रश्न! करीबी मतदाताओं की उपस्थिति के लिए मेरी माफ़ी। आप किस डेटाबेस का उपयोग कर रहे हैं? (एसक्यूएल सर्वर, MySQL, PostgreSQL, ओरेकल, ...) – Andomar
मैं SQL सर्वर – user1861065