एक तालिका में दूसरा उच्चतम मूल्य प्राप्त करें


14
id value
1   50
2   60
3   55

select max(value) from tablename;

आम तौर पर हम जानते हैं, हमें 60 मिलेंगे, लेकिन मुझे अगले मूल्य 55 की आवश्यकता है।

मैं SQL का उपयोग कर 55 का मान कैसे प्राप्त करूं?

जवाबों:


24

उच्चतम मान को केवल एक बार होता है, तो दूसरा तरीका उपयोग करना होगा OFFSET(SQL Server 2012 या बाद में):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

23

तालिका में दूसरा उच्चतम विशिष्ट मूल्य प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);

13

एक सामान्य समाधान नीचे की तरह हो सकता है:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

यहां आप जैसे रेंज को परिभाषित कर सकते हैं RowNum >= 10 AND RowNum <= 20। और यह आपको सभी आवश्यक कॉलम के साथ 10 वीं से 20 वीं पंक्तियां देगा।


7

आपके पास सामान्य शीर्ष चाल है जैसे:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

या आप सीटीई का उपयोग भी कर सकते हैं जैसे:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

या, यदि आप SQLServer (> = 2012) के हाल के संस्करण का उपयोग करते हैं, तो अंतराल फ़ंक्शन।

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc

5

मैं ऐसा करूंगा:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

1

आप ROW_NUMBER()विंडो फ़ंक्शन का भी उपयोग कर सकते हैं । यदि आप अपने लक्ष्य मान के अनुसार दूसरी प्रविष्टि प्राप्त करना चाहते हैं, तो आप कर सकते हैं:

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

अब यदि आप दूसरा उच्चतम मूल्य प्राप्त करना चाहते हैं और आपके पास डुप्लिकेट हैं, तो आप मान प्रविष्टि द्वारा समूह बनाना चाह सकते हैं ताकि आपको केवल अलग मूल्य मिलें।

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

MIN(id)यदि आप को दूसरे उच्चतम मूल्य के साथ पहले रिकॉर्ड की आईडी पता करने की आवश्यकता है (दो 60s और दो 55s के साथ एक डेटा सेट था) यह जानने के लिए आपको इस चयन को संशोधित करने में सक्षम होना चाहिए ।


5
दूसरे उच्चतम के लिए बस के ROW_NUMBER()साथ प्रतिस्थापित करना आसान है DENSE_RANK()- आपको मुफ्त में सभी अन्य कॉलम भी मिलते हैं। उपयोग करने की आवश्यकता नहीं है GROUP BY
ypercube y
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.