Bagaimana menemukan third or nthgaji maksimum dari gaji table(EmpID,EmpName,EmpSalary)dengan cara yang Dioptimalkan?
Bagaimana menemukan third or nthgaji maksimum dari gaji table(EmpID,EmpName,EmpSalary)dengan cara yang Dioptimalkan?
Jawaban:
Gunakan ROW_NUMBER(jika Anda menginginkan satu) atau DENSE_RANK(untuk semua baris terkait):
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
EmpSalarykolom. Juga, dikurangi dibandingkan dengan apa? Keuntungan dari ROW_NUMBERpendekatan ini adalah Anda dapat menggunakan ..OVER(PARTITION BY GroupColumn OrderBy OrderColumn). Jadi Anda dapat menggunakannya untuk mendapatkan grup tetapi tetap mengakses kolom mana pun.
Nomor Baris:
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)
Sub Query:
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary
)
Kata Kunci Teratas:
SELECT TOP 1 salary
FROM (
SELECT DISTINCT TOP n salary
FROM employee
ORDER BY salary DESC
) a
ORDER BY salary
... WHERE (N-1) = (Subquery)...berhasil. Subkueri adalah kueri berkorelasi karena WHEREklausulnya menggunakan Emp1dari kueri utama. Subkueri dievaluasi setiap kali kueri utama memindai baris. Contoh, jika kita mencari gaji terbesar ke-3 (N = 3) dari (800, 1000, 700, 750), subkueri untuk baris ke-1 SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800adalah 0. Untuk nilai gaji ke-4 (750) ... WHERE Emp2.Salary > 750adalah 2, atau N -1, maka baris ini akan dikembalikan.
Jika Anda ingin mengoptimalkan cara berarti menggunakan TOPKata kunci, Jadi permintaan gaji maks dan min ke-n sebagai berikut tetapi kueri tersebut terlihat rumit seperti dalam urutan terbalik dengan menggunakan nama fungsi agregat:
N gaji maksimal:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary DESC)
untuk Contoh: 3 gaji maksimal:
SELECT MIN(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary DESC)
N gaji minimum:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP N EmpSalary FROM Salary ORDER BY EmpSalary ASC)
untuk Contoh: 3 gaji minimum:
SELECT MAX(EmpSalary)
FROM Salary
WHERE EmpSalary IN(SELECT TOP 3 EmpSalary FROM Salary ORDER BY EmpSalary ASC)
Terlalu sederhana jika Anda menggunakan sub query!
SELECT MIN(EmpSalary) from (
SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3
);
Di sini Anda hanya dapat mengubah nilai ke-n setelah batasan LIMIT.
Di sini, di Sub query Pilih EmpSalary dari Employee Order oleh EmpSalary DESC Limit 3; akan mengembalikan gaji 3 teratas Karyawan. Dari hasil tersebut kita akan memilih gaji Minimum menggunakan perintah MIN untuk mendapatkan gaji TOP ke-3 dari karyawan tersebut.
Gantikan N dengan Nomor Maks Anda
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
Penjelasan
Kueri di atas bisa sangat membingungkan jika Anda belum pernah melihat yang seperti itu sebelumnya - kueri dalam adalah apa yang disebut sub-kueri berkorelasi karena kueri dalam (subkueri) menggunakan nilai dari kueri luar (dalam hal ini tabel Emp1 ) di klausa WHERE.
Dan Sumber
... WHERE (N-1) = (Subquery)...berhasil. Subkueri adalah kueri berkorelasi karena WHEREklausulnya menggunakan Emp1dari kueri utama. Subkueri dievaluasi setiap kali kueri utama memindai baris. Contoh, jika kita mencari gaji terbesar ke-3 (N = 3) dari (800, 1000, 700, 750), subkueri untuk baris ke-1 SELECT COUNT(DISTINCT(Emp2.Salary)) FROM Employee Emp2 WHERE Emp2.Salary > 800adalah 0. Untuk nilai gaji ke-4 (750) ... WHERE Emp2.Salary > 750adalah 2, atau N -1, maka baris ini akan dikembalikan.
Gaji maksimum ketiga atau n dari tabel gaji tanpa menggunakan subquery
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
Untuk gaji tertinggi ke-3 taruh 2 di tempat N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Lihat kueri berikut untuk mendapatkan gaji tertinggi n. Dengan cara ini Anda mendapatkan gaji tertinggi nth di MYSQL. Jika Anda ingin mendapatkan gaji terendah n hanya Anda perlu mengganti DESC dengan ASC di query.

SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Metode 1:
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
Metode 2:
Select EmpName,salary from
(
select EmpName,salary ,Row_Number() over(order by salary desc) as rowid
from EmpTbl)
as a where rowid=3
Pada tahun 2008 kita dapat menggunakan ROW_NUMBER () OVER (ORDER BY EmpSalary DESC) untuk mendapatkan peringkat tanpa ikatan yang dapat kita gunakan.
Misalnya kita bisa mendapatkan nilai tertinggi ke-8 dengan cara ini, atau mengubah @N menjadi sesuatu yang lain atau menggunakannya sebagai parameter dalam suatu fungsi jika Anda mau.
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;
Di SQL Server 2012 seperti yang Anda ketahui, ini dilakukan secara lebih intuitif menggunakan LAG ().
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
Ini adalah salah satu pertanyaan populer dalam wawancara SQL apa pun. Saya akan menuliskan kueri yang berbeda untuk mengetahui nilai tertinggi ke-n dari sebuah kolom.
Saya telah membuat tabel bernama "Emloyee" dengan menjalankan skrip di bawah ini.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
Sekarang saya akan memasukkan 8 baris ke dalam tabel ini dengan menjalankan pernyataan insert di bawah.
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)
Sekarang kita akan menemukan Basic_sal tertinggi ke-3 dari tabel di atas menggunakan kueri yang berbeda. Saya telah menjalankan kueri di bawah ini di studio manajemen dan di bawah ini adalah hasilnya.
select * from Employee order by Basic_Sal desc
Kita dapat melihat pada gambar di atas bahwa Gaji Pokok tertinggi ke-3 adalah 8500. Saya menulis 3 cara berbeda untuk melakukan hal yang sama. Dengan menjalankan ketiga query yang disebutkan di bawah ini kita akan mendapatkan hasil yang sama yaitu 8500.
Cara Pertama: - Menggunakan fungsi nomor baris
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;
Saya menunjukkan gaji tertinggi ke-3
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
Cara yang dioptimalkan: Alih-alih subkueri, cukup gunakan batas.
select distinct salary from employee order by salary desc limit nth, 1;
Lihat sintaks batas di sini http://www.mysqltutorial.org/mysql-limit.aspx
Untuk mendapatkan nilai tertinggi ketiga dari tabel
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
Menurut subkueri:
SELECT salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)
Coba Query ini
SELECT DISTINCT salary
FROM emp E WHERE
&no =(SELECT COUNT(DISTINCT salary)
FROM emp WHERE E.salary <= salary)
Masukkan n = nilai yang Anda inginkan
set @n = $n
SELECT a.* FROM ( select a.* , @rn = @rn+1 from EMPLOYEE order by a.EmpSalary desc ) As a where rn = @n
Coba kode ini: -
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);
Gantikan n dengan gaji tertinggi ke-n sebagai angka.
Coba yang ini...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
PILIH * DARI (pilih Gaji berbeda dari pesanan Pelanggan berdasarkan DESC gaji) batas 4,1;
Limit 4,1 artinya tinggalkan 4 baris pertama lalu pilih baris berikutnya.
Batasan dan jumlah baris tergantung pada platform yang Anda gunakan.
Coba ini, itu akan berhasil.
CATATAN: Harap ganti OFFSET 3 di Query dengan bilangan bulat ke N APA PUN
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
Deskripsi
FETCH NEXT 1 ROWS SAJA
mengembalikan hanya 1 baris
OFFSET 3 BARIS
kecualikan 3 catatan pertama Di sini Anda bisa mendapatkan bilangan bulat apa pun
Subkueri selalu membutuhkan lebih banyak waktu:
gunakan kueri di bawah ini untuk mendapatkan data tertinggi dan terendah:
Data Tertinggi: select *from business order by id desc limit 3,1;
Data terendah: select *from business order by id asc limit 3,1;
Dapat menggunakan N di tempat 3 untuk mendapatkan data ke-n.