Optimize edilmiş bir şekilde third or nth
maaştan maksimum maaş nasıl bulunur table(EmpID,EmpName,EmpSalary)
?
SELECT salary FROM (SELECT salary FROM employee ORDER BY salary DESC FETCH NEXT 3 ROWS ONLY) ORDER BY salary ASC FETCH NEXT 1 ROWS ONLY;
Optimize edilmiş bir şekilde third or nth
maaştan maksimum maaş nasıl bulunur table(EmpID,EmpName,EmpSalary)
?
SELECT salary FROM (SELECT salary FROM employee ORDER BY salary DESC FETCH NEXT 3 ROWS ONLY) ORDER BY salary ASC FETCH NEXT 1 ROWS ONLY;
Yanıtlar:
Kullanım ROW_NUMBER
ya da (tek istiyorsanız) DENSE_RANK
(Tüm ilgili satırlar için):
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
sütunda bir dizininiz yok . Ayrıca neye göre azaldı? ROW_NUMBER
Yaklaşımın avantajı , kullanabilmenizdir ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn)
. Böylece grupları almak için kullanabilir, ancak yine de herhangi bir sütununa erişebilirsiniz.
Satır numarası :
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)
Alt Sorgu:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
En İyi Anahtar Kelime:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...
işe yaradığını anlamak önemlidir . Alt sorgu, WHERE
yan tümcesi Emp1
ana sorgudan kullandığı için ilişkili bir sorgudur. Ana sorgu bir satırı her taradığında alt sorgu değerlendirilir. Örneğin, (800, 1000, 700, 750) 'den 3. en büyük maaşı (N = 3) bulacaksak, 1. satır için alt sorgu SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0 olacaktır. 4. maaş değeri (750) ... WHERE Emp2.Salary > 750
2 veya N olacaktır. -1, dolayısıyla bu satır döndürülecektir.
Optimize etme yöntemi istiyorsanız TOP
Anahtar Kelime kullanmak anlamına gelir , Dolayısıyla n'inci maksimum ve minimum maaşlar aşağıdaki gibi sorgulanır, ancak sorgular toplama işlev adlarını kullanarak ters sırada olduğu gibi zor görünür:
N maksimum maaş:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
Örn: 3 maksimum maaş:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N asgari maaş:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Örn: 3 asgari maaş:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Alt sorguyu kullanırsanız çok basit!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Burada sadece LIMIT kısıtlamasından sonra n'inci değeri değiştirebilirsiniz.
Burada bu Alt sorgu, Çalışan Siparişinden Çalışan Siparişinden Çalışan Maaşını Seçin DESC Limit 3; Çalışanların ilk 3 maaşını iade edecekti. Sonuç dışında, çalışanın 3. ÜST maaşını almak için MIN komutunu kullanarak Minimum maaşı seçeceğiz.
N'yi Maks Sayınızla değiştirin
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Açıklama
Daha önce böyle bir şey görmediyseniz yukarıdaki sorgu oldukça kafa karıştırıcı olabilir - iç sorgu, ilişkili alt sorgu olarak adlandırılır çünkü iç sorgu (alt sorgu) dış sorgudan bir değer kullanır (bu durumda Emp1 tablosu ) WHERE yan tümcesinde.
Ve Kaynak
... WHERE (N-1) = (Subquery)...
işe yaradığını anlamak önemlidir . Alt sorgu, WHERE
yan tümcesi Emp1
ana sorgudan kullandığı için ilişkili bir sorgudur. Ana sorgu bir satırı her taradığında alt sorgu değerlendirilir. Örneğin, (800, 1000, 700, 750) 'den 3. en büyük maaşı (N = 3) bulursak, 1. satırın alt sorgusu SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800
0 olacaktır. 4. maaş değeri için (750) ... WHERE Emp2.Salary > 750
2 veya N olacaktır -1, dolayısıyla bu satır döndürülecektir.
Alt sorgu kullanmadan maaş tablosundan üçüncü veya n. Maksimum maaş
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
3. en yüksek maaş için N-1 yerine 2 koyun
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
En yüksek maaşı almak için aşağıdaki sorguya bakın. Bu şekilde MYSQL'de n'inci en yüksek maaşı alırsınız. En düşük maaşı almak istiyorsanız, yalnızca sorguda DESC'i ASC ile değiştirmeniz gerekir.
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Yöntem 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Yöntem 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'de ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) kullanabiliriz ve kullanabileceğimiz bağlar olmadan bir sıralama elde edebiliriz.
Örneğin bu yolla 8. en yüksek olanı alabiliriz veya @N'yi başka bir şeye değiştirebiliriz veya isterseniz onu bir fonksiyonda parametre olarak kullanabiliriz.
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 Server 2012'de bildiğiniz gibi bu, LAG () kullanılarak daha sezgisel olarak gerçekleştirilir.
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Bu, herhangi bir SQL röportajındaki popüler sorulardan biridir. Bir sütunun n'inci en yüksek değerini bulmak için farklı sorgular yazacağım.
Aşağıdaki script'i çalıştırarak "Emloyee" adlı bir tablo oluşturdum.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Şimdi aşağıdaki insert deyimini çalıştırarak bu tabloya 8 satır ekleyeceğim.
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)
Şimdi, farklı sorgular kullanarak yukarıdaki tablodan 3. en yüksek Basic_sal'ı bulacağız. Aşağıdaki sorguyu yönetim stüdyosunda çalıştırdım ve sonuç aşağıdadır.
select * from Employee order by Basic_Sal desc
Yukarıdaki görüntüde 3. en yüksek Temel Maaşın 8500 olacağını görüyoruz. Aynısını yapmanın 3 farklı yolunu yazıyorum. Aşağıda belirtilen üç sorguyu da çalıştırarak aynı sonucu alacağız, yani 8500.
İlk Yol: - Satır numarası işlevini kullanma
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 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. en yüksek maaşı gösteriyorum
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
Optimize edilmiş yol: Alt sorgu yerine sadece limit kullanın.
select distinct salary from employee order by salary desc limit nth, 1;
Sınır sözdizimini burada http://www.mysqltutorial.org/mysql-limit.aspx görün
Tablodan üçüncü en yüksek değeri almak için
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Alt sorguya göre:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Bu Sorguyu Deneyin
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
N = istediğiniz değeri koyun
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Bu kodu deneyin: -
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'yi sayı olarak n'inci en yüksek maaşla değiştirin.
Bunu dene...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
SEÇİN * KİMDEN (Müşterilerden farklı Maaş seçin DESC'e göre sipariş verin) sınırı 4,1;
4,1 sınırı, ilk 4 satırı bırakıp ardından bir sonrakini seç anlamına gelir.
Limit ve satır sayısı, kullandığınız platforma bağlıdır.
Bunu dene, işe yarayacak.
NOT: Lütfen Sorgudaki OFSET 3'ü HERHANGİ N'inci tam sayı ile değiştirin
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Açıklama
SADECE SONRAKİ 1 SIRA FETCH
sadece 1 satır döndür
3 SIRA OFSET
ilk 3 kaydı hariç tut Burada herhangi bir tam sayı yapabilirsiniz
Alt sorgular her zaman daha fazla zaman alır:
en yüksek ve en düşük verileri almak için aşağıdaki sorguyu kullanın:
En Yüksek Veriler: select *from business order by id desc limit 3,1;
En düşük veri: select *from business order by id asc limit 3,1;
N'inci veriyi almak için 3 yerine N kullanabilir.