सैलरी टेबल से तीसरा या nth अधिकतम वेतन कैसे प्राप्त करें?


जवाबों:


82

का उपयोग करें ROW_NUMBER(यदि आप एक एकल चाहते हैं) या DENSE_RANK(सभी संबंधित पंक्तियों के लिए):

WITH CTE AS
(
    SELECT EmpID, EmpName, EmpSalary,
           RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
    FROM dbo.Salary
)
SELECT EmpID, EmpName, EmpSalary
FROM CTE
WHERE RN = @NthRow

टेबल से न्यूनतम वेतन रिकॉर्ड कैसे प्राप्त करें? ins.KYS_ID, ins.KYS_INS_ID का चयन cmn_pat_x_insurance ins से करें जहाँ ins.FKYS_PAT_ID = '1253_717' और ins.FKYS_INS_TYPE (1) और ins.BOL_TYPE इन (1,3) और ins.salary (मिनट्स)
कहावत किल्लारू

कल्पना कीजिए, कर्मचारी तालिका में 10,0000 रिकॉर्ड हैं। यदि मैं उपरोक्त क्वेरी का उपयोग करता हूं, तो प्रदर्शन 6-10 गुना कम हो जाएगा।
बिमल दास

1
@BimalDas: फिर आपके पास EmpSalaryकॉलम पर एक इंडेक्स नहीं है । इसके अलावा, क्या की तुलना में कम? ROW_NUMBERदृष्टिकोण का लाभ यह है कि आप उपयोग कर सकते हैं ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)। इसलिए आप इसका उपयोग समूहों को प्राप्त करने के लिए कर सकते हैं लेकिन फिर भी इसके किसी भी कॉलम को एक्सेस कर सकते हैं।
टिम श्मेल्टर

CTE के साथ @TimSchmelter इसमें पहले सेलेक्ट स्टेटमेंट के पूरे डेटा को स्टोर करने के लिए एक अस्थायी तालिका बनाएगा, फिर परिणाम में से हम "सिलेक्ट एम्पिड, एम्पनेम, CTE WHO RN =NthRow" से एम्प्लरी डायरी का चयन करेंगे। इसलिए मुझे लगता है कि यह थोड़ा धीमा है। मैंने इसे जाँचा था। और मेरे पास उचित अनुक्रमण भी है।
बिमल दास

2
@BimalDas: नहीं, यह एक अस्थायी तालिका नहीं बना रहा है। एक cte आमतौर पर कहीं भी भौतिक नहीं है। यह इनलाइन दृश्य या नामांकित सबक्वेरी की तरह अधिक है।
टिम श्मेल्टर

88

पंक्ति संख्या :

SELECT Salary,EmpName
FROM
  (
   SELECT Salary,EmpName,ROW_NUMBER() OVER(ORDER BY Salary) As RowNum
   FROM EMPLOYEE
   ) As A
WHERE A.RowNum IN (2,3)

उप क्वेरी:

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
               SELECT COUNT(DISTINCT(Emp2.Salary))
               FROM Employee Emp2
               WHERE Emp2.Salary > Emp1.Salary
               )

शीर्ष कीवर्ड:

SELECT TOP 1 salary
FROM (
      SELECT DISTINCT TOP n salary
      FROM employee
      ORDER BY salary DESC
      ) a
ORDER BY salary

टेबल से न्यूनतम वेतन रिकॉर्ड कैसे प्राप्त करें? ins.KYS_ID, ins.KYS_INS_ID का चयन cmn_pat_x_insurance ins से करें जहाँ ins.FKYS_PAT_ID = '1253_717' और ins.FKYS_INS_TYPE (1) और ins.BOL_TYPE इन (1,3) और ins.salary (मिनट्स)
कहावत किल्लारू

कुमार और अलेक्जेंडर, मैं इसके साथ एक और क्षेत्र प्राप्त करना चाहता हूं, यह कैसे करना है? मेरी क्वेरी "" "टॉप 1 नोटिफ़ सेलेक्ट करें (नोट डेटेड (वर्ष, समय-सारिणी, करंट_टाइमस्टैम्प) को नोटएज के रूप में चुनें, डिस्टिंक्ट टॉप 3 नोटिड से [डीबीओ]। नोटसीड के द्वारा ऑर्डर के अनुसार" नोटसिड द्वारा एक ऑर्डर ""
अब्बासी

मुझे nth सबसे अधिक वेतन मिल रहा है, लेकिन मुझे उप-क्वेरी को समझने के लिए जटिलता हो रही है, क्या आप उप-क्वेरी को समझाना चाहेंगे ...
दीपक गुप्ता

@deepak_java सबक्वेरी का मूल्यांकन हर बार किया जाता है और बाहरी क्वेरी द्वारा एक पंक्ति को संसाधित किया जाता है। दूसरे शब्दों में, आंतरिक क्वेरी को बाहरी क्वेरी से स्वतंत्र रूप से संसाधित नहीं किया जा सकता है क्योंकि आंतरिक क्वेरी Emp1 मान का भी उपयोग करती है।
कुमार मनीष

यह समझना महत्वपूर्ण है कि ... WHERE (N-1) = (Subquery)...काम क्यों करता है। WHEREउपखंड एक सहसंबद्ध क्वेरी है क्योंकि इसका खंड Emp1मुख्य क्वेरी से उपयोग करता है। सबक्वेरी का मूल्यांकन हर बार मुख्य क्वेरी एक पंक्ति में स्कैन किया जाता है। उदाहरण के लिए, यदि हम (800, 1000, 700, 750) से तीसरा सबसे बड़ा वेतन (N = 3) पाते हैं, तो पहली पंक्ति के लिए उपश्रेणी होगी SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800जो 0. है। 4 वें वेतन मान (750) के ... WHERE Emp2.Salary > 750लिए 2, या N होगा। -1, इसलिए यह पंक्ति वापस कर दी जाएगी।
जेरेमाउस

65

इसे इस्तेमाल करे

SELECT TOP 1 salary FROM (
   SELECT TOP 3 salary 
   FROM employees 
   ORDER BY salary DESC) AS emp 
ORDER BY salary ASC

3 के लिए आप किसी भी मूल्य को प्रतिस्थापित कर सकते हैं ...


इस oracle 10g या 11g के साथ काम करता है? या वहाँ एक विकल्प है जो इस तरह सुंदर है?
RBz

40

यदि आप चाहते हैं कि ऑप्टिमाइज़ करने का तरीका TOPकीवर्ड का उपयोग करें, तो nth अधिकतम और न्यूनतम वेतन क्वेरी निम्नानुसार है, लेकिन प्रश्न कुल मिलाकर एक ट्रिकी की तरह दिखते हैं, जो कुल फ़ंक्शन नामों का उपयोग करके रिवर्स ऑर्डर करते हैं:

अधिकतम वेतन:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

पूर्व के लिए: 3 अधिकतम वेतन:

SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC) 

न्यूनतम वेतन:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)

पूर्व के लिए: 3 न्यूनतम वेतन:

SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)

सबसे सरल, और याद रखने में आसान। +1
Sain16ошƒаӽ

4
हम एएससी ऑर्डर में अधिकतम वेतन क्यों प्राप्त कर रहे हैं, यह डीईएससी ऑर्डर में किया जाना है, अगर हमारे पास इस तरह का वेतन 7000,10000,11000,500,800,900,12000 है, तो इनर छँटाई का आंतरिक परिणाम परिणाम होगा। इसका अर्थ है 500,800,900 और इनमें से अधिकतम 900 है, लेकिन 900 अधिकतम 3 नहीं है, 3 अधिकतम वेतन 10000 है।
नरेंद्र जग्गी

1
Ex: 3 अधिकतम वेतन के लिए: यह उस तरह का होना चाहिए, जिसमें सेलेक्ट मिन (एम्पलरी) है, जहां से एम्पलरी में सेलेक्ट करें (सिलेक्ट टॉप 3 एम्पलरी फ्रॉम सैलरी ऑर्डर्स बाय एम्पलरी DESC
जिमित रूपानी

15

बहुत आसान है अगर आप उप क्वेरी का उपयोग करते हैं!

SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);

आप यहाँ केवल लिमिट बाधा के बाद nth मान बदल सकते हैं।

यहाँ इस उप क्वेरी में कर्मचारी क्रम से EmpSalary का चयन करें EmpSalary DESC Limit 3 द्वारा; कर्मचारियों के शीर्ष 3 वेतन लौटाएगा। परिणाम के बाहर हम न्यूनतम आदेश का चयन करेंगे, ताकि कर्मचारी का तीसरा शीर्ष वेतन पाने के लिए MIN कमांड का उपयोग किया जा सके।


यह त्रुटि हो रही है। त्रुटि कोड: 1248 प्रत्येक व्युत्पन्न तालिका का अपना उपनाम होना चाहिए

इसके लिए एक उपनाम जोड़ें .. से सेलेक्ट मिन (कर्मचारी) का चयन करें (एम्प्लॉई ऑर्डर से एम्प्लॉई डीईएससी लिमिट 3 से एसिमेंट एम्प्लरी);
अपराह्न

डुप्लिकेट का उपयोग केवल डुप्लिकेट से बचने के लिए सेलेक्ट मिन (एम्प्लेरी) से (सिलेक्ट डिस्टिंक्ट (एम्पलरी) एम्प्लॉई ऑर्डर से एम्प्लरी डीएससी लिमिट 3 से करें);
कल्पेश पारिख

14

N को अपने मैक्स नंबर से बदलें

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

व्याख्या

उपरोक्त क्वेरी काफी भ्रामक हो सकती है यदि आपने पहले ऐसा कुछ नहीं देखा है - आंतरिक क्वेरी वह है जिसे सहसंबद्ध उप-क्वेरी कहा जाता है क्योंकि आंतरिक क्वेरी (उपकुंजी) बाहरी क्वेरी से मान का उपयोग करती है (इस मामले में Emp1 तालिका ) इसमें जहां क्लॉज है।

और स्रोत


+1 यह समझना महत्वपूर्ण है कि ... WHERE (N-1) = (Subquery)...काम क्यों करता है। WHEREउपखंड एक सहसंबद्ध क्वेरी है क्योंकि इसका खंड Emp1मुख्य क्वेरी से उपयोग करता है। सबक्वेरी का मूल्यांकन हर बार मुख्य क्वेरी एक पंक्ति में स्कैन किया जाता है। उदाहरण के लिए, यदि हम (800, 1000, 700, 750) से तीसरा सबसे बड़ा वेतन (N = 3) पाते हैं, तो पहली पंक्ति के लिए उपश्रेणी होगी SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800जो 0. है। 4 वें वेतन मान (750) के ... WHERE Emp2.Salary > 750लिए 2, या N होगा। -1, इसलिए यह पंक्ति वापस कर दी जाएगी।
जेरेमाउस

13

उप-वर्ग का उपयोग किए बिना वेतन तालिका से तीसरा या nth अधिकतम वेतन

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

3 उच्चतम वेतन के लिए एन -1 के स्थान पर 2 रखे


3
यह उल्लेख करना महत्वपूर्ण है कि OFFSET FETCH SQL सर्वर 2012 + संस्करण से उपलब्ध है।
Zerotoinfinity

11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3

1
DENSE_RANK () के लिए धन्यवाद मैंने इसके बारे में कभी नहीं सुना है
विवेक

8

N n उच्चतम वेतन पाने के लिए क्वेरी का अनुसरण करें। इस तरह आपको MYSQL में nth उच्चतम वेतन मिलता है। यदि आप nth सबसे कम वेतन चाहते हैं, तो आपको क्वेरी में ASC द्वारा DESC को बदलने की आवश्यकता है। nth उच्चतम वेतन


1
सवाल SQL- सर्वर नहीं MySQL के बारे में है।
बुम्मी


6

विधि 1:

SELECT TOP 1 salary FROM (
SELECT TOP 3 salary 
 FROM employees 
  ORDER BY salary DESC) AS emp 
 ORDER BY salary ASC

विधि 2:

  Select EmpName,salary from
  (
    select EmpName,salary ,Row_Number() over(order by salary desc) as rowid      
     from EmpTbl)
   as a where rowid=3

विधि 1 को सॉर्ट किया जा सकता है: Select TOP 1 SALARY FROM (SELECT TOP 3 SALARY FROM EMPLOYEES) * कारण- क्योंकि डिफ़ॉल्ट रूप से इसका आरोही क्रम
आशीष अग्रवाल योडली

5

2008 में हम ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) का उपयोग करके बिना किसी रैंक के रैंक प्राप्त कर सकते हैं जिसका हम उपयोग कर सकते हैं।

उदाहरण के लिए हम इस तरह से 8 वां सबसे ऊंचा स्थान प्राप्त कर सकते हैं, या @N को कुछ और में बदल सकते हैं या यदि आप चाहें तो किसी फ़ंक्शन में पैरामीटर के रूप में उपयोग कर सकते हैं।

DECLARE @N INT = 8;
WITH rankedSalaries AS
(
SELECT
EmpID
,EmpName
,EmpSalary,
,RN = ROW_NUMBER() OVER (ORDER BY EmpSalary DESC)
FROM salary
)
SELECT
EmpID
,EmpName
,EmpSalary
FROM rankedSalaries
WHERE RN = @N;

SQL सर्वर 2012 में जैसा कि आप जानते हैं कि यह LAG () का उपयोग करके अधिक सहजता से किया जाता है।



3

यह किसी भी SQL साक्षात्कार में लोकप्रिय प्रश्न है। मैं एक स्तंभ के nth उच्चतम मूल्य का पता लगाने के लिए विभिन्न प्रश्नों को लिखने जा रहा हूं।

मैंने नीचे स्क्रिप्ट चलाकर "एमोली" नाम की एक तालिका बनाई है।

CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)

अब मैं नीचे डालने के बयान द्वारा इस तालिका में 8 पंक्तियाँ डालने जा रहा हूँ।

insert into Employee values(1,'Neeraj',45000)
insert into Employee values(2,'Ankit',5000)
insert into Employee values(3,'Akshay',6000)
insert into Employee values(4,'Ramesh',7600)
insert into Employee values(5,'Vikas',4000)
insert into Employee values(7,'Neha',8500)
insert into Employee values(8,'Shivika',4500)
insert into Employee values(9,'Tarun',9500)

अब हम विभिन्न प्रश्नों का उपयोग करते हुए उपरोक्त तालिका से 3rd उच्चतम Basic_sal का पता लगाएंगे। मैंने नीचे प्रबंधन क्वेरी को स्टूडियो में चलाया है और नीचे परिणाम है।

select * from Employee order by Basic_Sal desc

हम उपरोक्त छवि में देख सकते हैं कि तीसरा उच्चतम बेसिक वेतन 8500 होगा। मैं इसे करने के 3 अलग-अलग तरीके लिख रहा हूं। नीचे दिए गए सभी तीन प्रश्नों को चलाने से हमें एक ही परिणाम मिलेगा अर्थात 8500।

पहला तरीका: - पंक्ति संख्या फ़ंक्शन का उपयोग करना

select Ename,Basic_sal
from(
            select Ename,Basic_Sal,ROW_NUMBER() over (order by Basic_Sal desc) as rowid from Employee
      )A
where rowid=2

3
Select TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

मैं तीसरा उच्चतम वेतन दिखा रहा हूं



3

- उच्चतम वेतन

select * 
from (select lstName, salary, row_number() over( order by salary desc) as rn 
      from employee) tmp
where rn = 2

- (nth -1) उच्चतम वेतन

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )

3

अनुकूलित तरीका: सबक्वायरी के बजाय बस सीमा का उपयोग करें।

select distinct salary from employee order by salary desc limit nth, 1;

सीमा सिंटैक्स यहां देखें http://www.mysqltutorial.org/mysql-limit.aspx


हाँ! यह बहुत सरल और साफ समाधान है।
अवनीश अलोक


2

उपशम द्वारा:

SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)

1

इस क्वेरी का प्रयास करें

SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary) 
FROM emp WHERE E.salary <= salary)

N = जो आप चाहते हैं मूल्य



1

MySQL परीक्षण समाधान, मान N = 4:

select min(CustomerID) from (SELECT distinct CustomerID FROM Customers order by CustomerID desc LIMIT 4) as A;

एक और उदाहरण:

select min(country) from (SELECT distinct country FROM Customers order by country desc limit 3);


1
select * from employee order by salary desc;

+------+------+------+-----------+
| id   | name | age  | salary    |
+------+------+------+-----------+
|    5 | AJ   |   20 | 100000.00 |
|    4 | Ajay |   25 |  80000.00 |
|    2 | ASM  |   28 |  50000.00 |
|    3 | AM   |   22 |  50000.00 |
|    1 | AJ   |   24 |  30000.00 |
|    6 | Riu  |   20 |  20000.00 |
+------+------+------+-----------+




select distinct salary from employee e1 where (n) = (select count( distinct(salary) ) from employee e2 where e1.salary<=e2.salary);

N को नंबर के रूप में nth उच्चतम वेतन के साथ बदलें।



0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

2 सबसे अधिक वेतन के लिए, उपरोक्त क्वेरी में 3 से 2 को बदलें और N को उच्चतम वेतन के लिए N = 1,2,3,4 ...।


0

का चयन करें * FROM (वेतन DESC द्वारा ग्राहकों के आदेश से अलग वेतन का चयन करें) सीमा 4,1;

सीमा ४,१ का अर्थ है पहले ४ पंक्तियों को छोड़ दें और फिर अगले को चुनें।

आपके द्वारा उपयोग किए जा रहे प्लेटफ़ॉर्म पर सीमा और पंक्तिबद्धता निर्भर करती है।

यह कोशिश करो, यह काम करेगा।


0

नोट: कृपया किसी भी Nth पूर्णांक संख्या के साथ क्वेरी में OFFSET 3 को बदलें

SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS 
FETCH NEXT 1 ROWS ONLY

विवरण

केवल 1 बार अगला पाठ करें

केवल 1 पंक्ति वापस करें

OFFSET 3 ROWS

पहले 3 रिकॉर्ड को बाहर करें यहां आप किसी भी पूर्णांक संख्या को देख सकते हैं


0

उपश्रेणियाँ हमेशा अधिक समय लेती हैं:

किसी भी उच्चतम और निम्नतम डेटा को प्राप्त करने के लिए क्वेरी के नीचे उपयोग करें:

उच्चतम डेटा: select *from business order by id desc limit 3,1;

निम्नतम डेटा: select *from business order by id asc limit 3,1;

N डेटा प्राप्त करने के लिए 3 के स्थान पर N का उपयोग कर सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.