जवाबों:
का उपयोग करें 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
EmpSalary
कॉलम पर एक इंडेक्स नहीं है । इसके अलावा, क्या की तुलना में कम? ROW_NUMBER
दृष्टिकोण का लाभ यह है कि आप उपयोग कर सकते हैं ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
। इसलिए आप इसका उपयोग समूहों को प्राप्त करने के लिए कर सकते हैं लेकिन फिर भी इसके किसी भी कॉलम को एक्सेस कर सकते हैं।
पंक्ति संख्या :
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
... 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, इसलिए यह पंक्ति वापस कर दी जाएगी।
यदि आप चाहते हैं कि ऑप्टिमाइज़ करने का तरीका 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)
बहुत आसान है अगर आप उप क्वेरी का उपयोग करते हैं!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
आप यहाँ केवल लिमिट बाधा के बाद nth मान बदल सकते हैं।
यहाँ इस उप क्वेरी में कर्मचारी क्रम से EmpSalary का चयन करें EmpSalary DESC Limit 3 द्वारा; कर्मचारियों के शीर्ष 3 वेतन लौटाएगा। परिणाम के बाहर हम न्यूनतम आदेश का चयन करेंगे, ताकि कर्मचारी का तीसरा शीर्ष वेतन पाने के लिए MIN कमांड का उपयोग किया जा सके।
N को अपने मैक्स नंबर से बदलें
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
व्याख्या
उपरोक्त क्वेरी काफी भ्रामक हो सकती है यदि आपने पहले ऐसा कुछ नहीं देखा है - आंतरिक क्वेरी वह है जिसे सहसंबद्ध उप-क्वेरी कहा जाता है क्योंकि आंतरिक क्वेरी (उपकुंजी) बाहरी क्वेरी से मान का उपयोग करती है (इस मामले में 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, इसलिए यह पंक्ति वापस कर दी जाएगी।
उप-वर्ग का उपयोग किए बिना वेतन तालिका से तीसरा या nth अधिकतम वेतन
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
3 उच्चतम वेतन के लिए एन -1 के स्थान पर 2 रखे
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
विधि 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
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 () का उपयोग करके अधिक सहजता से किया जाता है।
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
यह किसी भी 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
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
- उच्चतम वेतन
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 )
अनुकूलित तरीका: सबक्वायरी के बजाय बस सीमा का उपयोग करें।
select distinct salary from employee order by salary desc limit nth, 1;
सीमा सिंटैक्स यहां देखें http://www.mysqltutorial.org/mysql-limit.aspx
तालिका से तीसरा उच्चतम मूल्य प्राप्त करने के लिए
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
इस क्वेरी का प्रयास करें
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
N = जो आप चाहते हैं मूल्य
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
इस कोड को आज़माएं: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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 उच्चतम वेतन के साथ बदलें।
इसको आजमाओ...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
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 ...।
का चयन करें * FROM (वेतन DESC द्वारा ग्राहकों के आदेश से अलग वेतन का चयन करें) सीमा 4,1;
सीमा ४,१ का अर्थ है पहले ४ पंक्तियों को छोड़ दें और फिर अगले को चुनें।
आपके द्वारा उपयोग किए जा रहे प्लेटफ़ॉर्म पर सीमा और पंक्तिबद्धता निर्भर करती है।
यह कोशिश करो, यह काम करेगा।
नोट: कृपया किसी भी 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 रिकॉर्ड को बाहर करें यहां आप किसी भी पूर्णांक संख्या को देख सकते हैं
उपश्रेणियाँ हमेशा अधिक समय लेती हैं:
किसी भी उच्चतम और निम्नतम डेटा को प्राप्त करने के लिए क्वेरी के नीचे उपयोग करें:
उच्चतम डेटा: select *from business order by id desc limit 3,1;
निम्नतम डेटा: select *from business order by id asc limit 3,1;
N डेटा प्राप्त करने के लिए 3 के स्थान पर N का उपयोग कर सकते हैं।