id value
1 50
2 60
3 55
select max(value) from tablename;
आम तौर पर हम जानते हैं, हमें 60 मिलेंगे, लेकिन मुझे अगले मूल्य 55 की आवश्यकता है।
मैं SQL का उपयोग कर 55 का मान कैसे प्राप्त करूं?
id value
1 50
2 60
3 55
select max(value) from tablename;
आम तौर पर हम जानते हैं, हमें 60 मिलेंगे, लेकिन मुझे अगले मूल्य 55 की आवश्यकता है।
मैं SQL का उपयोग कर 55 का मान कैसे प्राप्त करूं?
जवाबों:
उच्चतम मान को केवल एक बार होता है, तो दूसरा तरीका उपयोग करना होगा OFFSET
(SQL Server 2012 या बाद में):
SELECT *
FROM tablename
ORDER BY column DESC
OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
तालिका में दूसरा उच्चतम विशिष्ट मूल्य प्राप्त करने के लिए आप इसका उपयोग कर सकते हैं
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);
एक सामान्य समाधान नीचे की तरह हो सकता है:
;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 वीं पंक्तियां देगा।
आपके पास सामान्य शीर्ष चाल है जैसे:
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
आप 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 के साथ एक डेटा सेट था) यह जानने के लिए आपको इस चयन को संशोधित करने में सक्षम होना चाहिए ।
ROW_NUMBER()
साथ प्रतिस्थापित करना आसान हैDENSE_RANK()
- आपको मुफ्त में सभी अन्य कॉलम भी मिलते हैं। उपयोग करने की आवश्यकता नहीं हैGROUP BY
।