दूसरा सबसे बड़ा मान ज्ञात करने के लिए सबसे सरल SQL क्वेरी क्या है?


168

किसी विशिष्ट स्तंभ में दूसरा सबसे बड़ा पूर्णांक मान ज्ञात करने के लिए सबसे सरल SQL क्वेरी क्या है?

कॉलम में संभवतः डुप्लिकेट मान हैं।


इस उद्देश्य के लिए ऑफ़सेट का उपयोग करें ... [dbo] से एक्सटेंशन का चयन करें। [विस्तार से] कर्मचारी desc ऑफ़सेट द्वारा 2 पंक्तियाँ अगली 1 पंक्तियाँ प्राप्त करें
Jinto John

जवाबों:


294
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

7
मैट का और साथ ही विनय का जवाब डुप्लिकेट का भी ख्याल रखता है। मान लीजिए कि सबसे बड़ा मान दोहराया जाता है, तो मैट के उत्तर का उपयोग करना सही दूसरा सबसे बड़ा मूल्य पैदा करेगा जबकि यदि आपने शीर्ष 2 डीएससी और मिनट दृष्टिकोण का उपयोग किया है, तो आपको इसके बजाय सबसे बड़ा मूल्य मिल सकता है।
पंकज शर्मा

क्या होगा अगर वहाँ कई दूसरे उच्चतम हैं ... तो यह सभी टुपल्स नहीं देगा
पार्थ

2
धन्यवाद, इसका उपयोग यहां
Shaijut

आंतरिक कथन के लिए ORDER_BY और LIMIT का उपयोग करने से मेरे दृष्टिकोण से बहुत बेहतर
andig

ध्यान दें कि यह एक परिणाम नहीं लौटाएगा यदि अनुरोध किए गए एक से पहले कोई रिकॉर्ड नहीं है।
andig


31

T-Sql में दो तरीके हैं:

--filter out the max
select max( col )
from [table]
where col < ( 
    select max( col )
    from [table] )

--sort top two then bottom one
select top 1 col 
from (
    select top 2 col 
    from [table]
    order by col) topTwo
order by col desc 

माइक्रोसॉफ्ट एसक्यूएल में पहला तरीका दूसरे की तुलना में दोगुना है, भले ही प्रश्न में कॉलम को क्लस्टर किया गया हो।

ऐसा इसलिए है क्योंकि तालिका या इंडेक्स स्कैन की तुलना में सॉर्ट ऑपरेशन अपेक्षाकृत धीमा है max एकत्रीकरण का उपयोग ।

वैकल्पिक रूप से, Microsoft SQL 2005 और इसके बाद के संस्करण में आप ROW_NUMBER()फ़ंक्शन का उपयोग कर सकते हैं :

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2

20

मैं कुछ SQL सर्वर विशिष्ट और कुछ MySQL विशिष्ट समाधान यहाँ देख रहा हूँ, ताकि आप स्पष्ट कर सकें कि आपको किस डेटाबेस की आवश्यकता है। हालांकि अगर मुझे लगता था कि मुझे SQL सर्वर कहना होगा क्योंकि यह MySQL में तुच्छ है।

मैं कुछ समाधान भी देखता हूं जो काम नहीं करेंगे क्योंकि वे डुप्लिकेट के लिए संभावना को ध्यान में रखते हैं, इसलिए सावधान रहें कि आप किन चीजों को स्वीकार करते हैं। अंत में, मुझे कुछ दिखाई देता है जो काम करेगा लेकिन वह तालिका के दो पूर्ण स्कैन करेगा। आप यह सुनिश्चित करना चाहते हैं कि 2 स्कैन केवल 2 मानों को देख रहा है।

SQL सर्वर (2012 से पहले):

SELECT MIN([column]) AS [column]
FROM (
    SELECT TOP 2 [column] 
    FROM [Table] 
    GROUP BY [column] 
    ORDER BY [column] DESC
) a

माई एसक्यूएल:

SELECT `column` 
FROM `table` 
GROUP BY `column` 
ORDER BY `column` DESC 
LIMIT 1,1

अपडेट करें:

SQL सर्वर 2012 अब एक बहुत क्लीनर (और मानक ) OFFSET / FETCH सिंटैक्स का समर्थन करता है:

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

यह वही है जो मैं देखने की उम्मीद कर रहा था। स्वीकृत उत्तर बदसूरत हो जाता है यदि आपको किसी के लिए काम करने की आवश्यकता है n। यह एक परीक्षा है।
रॉबिन माबेन

@ रोबिनबेन रॉबिन, परिदृश्य के बारे में कैसे सबसे बड़ा मूल्य दोहराया जाता है? मान लें कि एक कॉलम में 100 के माध्यम से संख्या 1 है लेकिन 100 को दो बार दोहराया जाता है। फिर यह समाधान 100 के रूप में दूसरा सबसे बड़ा मूल्य पैदा करेगा, जो गलत होगा। सही?
पंकज शर्मा

1
@ पंकजशर्मा नहीं, यह अभी भी काम करेगा, क्योंकि ग्रुप बाय क्लॉज
जोएल कोएहॉर्न

यह ऐसा करने का मानक तरीका है। स्वीकृत उत्तर को इस पर अद्यतन किया जाना चाहिए।
गिलहर्मे मेलो

1
मुझे एक त्रुटि मिलती है जो कहती है कि मैं उपयोग नहीं कर सकता TOPऔर OFFSETउसी क्वेरी में।
नकली

15

मुझे लगता है कि आप कुछ ऐसा कर सकते हैं:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

या

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

आपके डेटाबेस सर्वर पर निर्भर करता है। संकेत: SQL सर्वर LIMIT नहीं करता है।


अद्यतन- SQL सर्वर 2012 ने उपर्युक्त dbadiaries.com/ के
iliketocode

मान लें कि आपके पास समान मूल्य के साथ 2 तत्व हैं लेकिन सबसे बड़ा तत्व भी है। मुझे लगता है कि आपको करना होगाOFFSET 2
कंगना

ग्रुप बाय क्लॉज जोड़ना इसमें डुप्लीकेट कंडीशन को पूरा करेगा।
सैफ

7

आवेदन में निर्धारित इस परिणाम से दूसरा मूल्य प्राप्त करना सबसे आसान होगा:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

लेकिन अगर आपको एसक्यूएल का उपयोग करके दूसरे मूल्य का चयन करना चाहिए, तो कैसे:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t

1
क्या आपने इसे SQL सर्वर पर चलाया है?
क्रेग

1
@ क्रेग - LIMITMySql सिंटैक्स है, प्रश्न SQL संस्करण निर्दिष्ट नहीं करता है।
कीथ

7

आप निम्नलिखित क्वेरी का उपयोग करके कॉलम का दूसरा सबसे बड़ा मूल्य पा सकते हैं

SELECT *
FROM TableName a
WHERE
  2 = (SELECT count(DISTINCT(b.ColumnName))
       FROM TableName b WHERE
       a.ColumnName <= b.ColumnName);

आप नीचे दिए गए लिंक पर अधिक जानकारी पा सकते हैं

http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html


मृत लिंक का संग्रह: web.archive.org/web/20130406161645/http://…
xgMz

4

दूसरी सबसे बड़ी कीमत खोजने के लिए एक बहुत ही सरल क्वेरी

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;

4

MSSQL

SELECT  *
  FROM [Users]
    order by UserId desc OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

माई एसक्यूएल

SELECT  *
  FROM Users
    order by UserId desc LIMIT 1 OFFSET 1

उप प्रश्नों की कोई आवश्यकता नहीं है ... बस एक पंक्ति छोड़ें और अवरोही क्रम से दूसरी पंक्तियों का चयन करें


3
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

यह क्वेरी परिणाम से अधिकतम वेतन लौटाएगी - जिसमें समग्र तालिका से अधिकतम वेतन नहीं है।


2
क्या आप यह समझाने के लिए संपादित कर सकते हैं कि यह पुराने उत्तरों से काफी अलग कैसे है?
नाथन तुग्गी

3

पुराना सवाल जो मुझे पता है, लेकिन इससे मुझे एक बेहतर निष्पादन योजना मिली:

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column

3

यह बहुत ही सरल कोड है, आप इसे आजमा सकते हैं: -

ex: टेबल का नाम = परीक्षण

salary 

1000
1500
1450
7500

2 सबसे बड़ा मूल्य पाने के लिए MSSQL कोड

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

यहाँ 'ऑफ़सेट 1 रो' का अर्थ है टेबल की दूसरी पंक्ति और 'अगली 1 पंक्तियाँ लाने के लिए' केवल 1 पंक्ति दिखाने के लिए है। यदि आप 'केवल अगली पंक्तियों को लाने' का उपयोग नहीं करते हैं तो यह दूसरी पंक्ति से सभी पंक्तियों को दिखाता है।


सबसे अनुकूलित और संसाधन अनुकूल उत्तर। मैंने इसे अपने उपनगर में उपयोग करते हुए काफी समय बचाया। धन्यवाद।
vibs2006

2

select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
    from table_1)as table_new tn inner join table_1 t1
    on tn.col_1 = t1.col_1
where row = 2

आशा है कि किसी भी पंक्ति के लिए मान प्राप्त करने में मदद मिलेगी .....



1
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

ध्यान दें

साल है कोल नेम
एम्प, टेबल नेम


1

टॉम, का मानना ​​है कि यह तब विफल होगा जब select max([COLUMN_NAME]) from [TABLE_NAME]अनुभाग में एक से अधिक मान लौटाए गए हों । यानी जहां डेटा सेट में 2 से अधिक मान हैं।

आपकी क्वेरी में थोड़ा संशोधन काम करेगा -

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
  ( select max([COLUMN_NAME]) from [TABLE_NAME] )

1
select max(COL_NAME) from TABLE_NAME where COL_NAME in 
    (select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));

सबक्वेरी सबसे बड़े के अलावा सभी मूल्यों को लौटाता है। लौटी सूची से अधिकतम मूल्य चुनें।


1
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2




1

जैसा कि आपने डुप्लिकेट मानों का उल्लेख किया है। ऐसे मामले में आप DISTINCT और GROUP BY का उपयोग कर सकते हैं दूसरे उच्चतम मूल्य का पता लगाने के लिए का

यहाँ एक टेबल है

वेतन

:

यहां छवि विवरण दर्ज करें

समूह द्वारा

SELECT  amount FROM  salary 
GROUP by amount
ORDER BY  amount DESC 
LIMIT 1 , 1

DISTINCT

SELECT DISTINCT amount
FROM  salary 
ORDER BY  amount DESC 
LIMIT 1 , 1

लिमिट का पहला भाग = आरंभिक सूचकांक

लिमिट का दूसरा भाग = कितने मूल्य


1
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )

यह एम्पायर टेबल की तीसरी सबसे बड़ी सैलरी लौटाएगा



0

कुछ इस तरह? मैंने इसका परीक्षण नहीं किया है, हालांकि:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x


0

एक सहसंबद्ध क्वेरी का उपयोग करना:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)

0
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

यह क्वेरी अधिकतम तीन वेतन का चयन करती है। यदि दो समान वेतन मिलते हैं तो यह क्वेरी को प्रभावित नहीं करता है।



0

यह MS SQL में काम करता है:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.