Bagaimana menemukan gaji maksimum ketiga atau ke-n dari tabel gaji?

Jawaban:

82

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
Tim Schmelter
sumber
bagaimana cara mendapatkan catatan gaji minimum dari tabel? pilih ins.KYS_ID, ins.FKYS_INS_ID dari cmn_pat_x_insurance ins dimana ins.FKYS_PAT_ID = '1253_717' dan ins.FKYS_INS_TYPE di (1) dan ins.BOL_TYPE di (1,3) dan ins.salary in (min (ins.salary))
saidesh kilaru
Bayangkan, ada 10,0000 record di tabel karyawan. Jika saya menggunakan query di atas, performanya akan berkurang 6-10 kali lipat.
Bimal Das
1
@BimalDas: maka Anda tidak memiliki indeks pada 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.
Tim Schmelter
@TimSchmelter WITH CTE akan membuat tabel sementara untuk menyimpan seluruh data pernyataan SELECT pertama ke dalamnya, kemudian dari hasil tersebut kita memilih "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow". Itulah mengapa saya rasa ini agak lambat. Saya memeriksanya. dan saya juga memiliki pengindeksan yang tepat.
Bimal Das
2
@ BimalDas: Tidak, ini tidak membuat tabel sementara. Sebuah cte biasanya tidak terwujud dimanapun. Ini lebih seperti tampilan sebaris atau subkueri bernama.
Tim Schmelter
88

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
Kumar Manish
sumber
bagaimana cara mendapatkan catatan gaji minimum dari tabel? pilih ins.KYS_ID, ins.FKYS_INS_ID dari cmn_pat_x_insurance ins dimana ins.FKYS_PAT_ID = '1253_717' dan ins.FKYS_INS_TYPE di (1) dan ins.BOL_TYPE di (1,3) dan ins.salary in (min (ins.salary))
saidesh kilaru
Kumar dan Alexander, saya ingin mendapatkan satu bidang lagi dengannya, bagaimana cara melakukannya? kueri saya seperti "" "Pilih 1 NoteID Teratas Dari (Pilih DateDiff (Tahun, SchedualDate, Current_TimeStamp) sebagai NoteAge, Distinct Top 3 NoteID Dari [dbo]. [DocSecheduale] Order by NoteID Desc) a Order by NoteID" ""
Zaveed Abbasi
Saya menemukan gaji tertinggi nth tetapi saya mendapatkan kerumitan untuk memahami sub-query, apakah Anda ingin menjelaskan sub-query ...
Deepak Gupta
@deepak_java subkueri dievaluasi setiap kali baris diproses oleh kueri luar. Dengan kata lain, kueri dalam tidak bisa diproses secara independen dari kueri luar karena kueri dalam menggunakan nilai Emp1 juga.
Kumar Manish
Penting untuk memahami mengapa ... 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.
jerrymouse
65

Coba ini

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

Untuk 3 Anda dapat mengganti nilai apa pun ...

Codesen
sumber
apakah ini bekerja dengan oracle 10g atau 11g? Ataukah ada alternatif lain yang cukup seperti ini?
RBz
40

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)
Rajesh Pathakoti
sumber
Paling sederhana dan paling mudah diingat. +1
Sнаđошƒаӽ
4
untuk mendapatkan gaji maksimal kenapa kita melakukan order ASC harus dilakukan dengan urutan DESC, jika kita memiliki gaji seperti ini 7000,10000,11000,500,800,900,12000, maka inner query sorting akan menghasilkan top3 yang artinya 500,800,900 dan maksimum 900, tetapi 900 bukan maksimum 3, gaji maksimum 3 adalah 10.000.
Narendra Jaggi
1
Contoh: 3 gaji maksimal: Harus seperti itu SELECT Min (EmpSalary) FROM Gaji WHERE EmpSalary IN (SELECT TOP 3 EmpSalary FROM Gaji ORDER BY DESC EmpSalary)
Jimit Rupani
15

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.

anonxss
sumber
Mendapatkan kesalahan ini. Kode Kesalahan: 1248 Setiap tabel turunan harus memiliki alias sendiri
tambahkan alias untuk itu .. SELECT MIN (EmpSalary) from (SELECT EmpSalary from Employee ORDER BY EmpSalary DESC LIMIT 3) as s;
anonxss
Cukup gunakan DISTINCT untuk menghindari duplikat SELECT MIN (EmpSalary) dari (SELECT DISTINCT (EmpSalary) dari Employee ORDER BY EmpSalary DESC LIMIT 3);
Kalpesh Parikh
14

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

Luv
sumber
+1 Sangatlah penting untuk memahami mengapa ... 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.
jerrymouse
13

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

Darvi Sunny
sumber
3
Penting untuk disebutkan bahwa OFFSET FETCH tersedia dari versi SQL Server 2012 +.
Zerotoinfinity
11
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
Pankaj Gaikwad
sumber
1
Terima kasih untuk DENSE_RANK () saya belum pernah mendengarnya
Vivekh
8

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. gaji tertinggi nth

Vijay Bhatt
sumber
1
Pertanyaannya adalah tentang SQL-Server bukan MySQL.
bummi
8
SELECT EmpSalary 
FROM salary_table 
GROUP BY EmpSalary 
ORDER BY EmpSalary DESC LIMIT n-1, 1;
Saurabh Chandra Patel
sumber
6

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

sumber
Cara 1 bisa diurutkan: PILIH TOP 1 GAJI DARI (PILIH TOP 3 GAJI DARI KARYAWAN) * alasan- karena secara default urutannya naik
Ashish Agrawal Yodlee
5

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 ().

David Söderlund
sumber
4
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal
Uma Shankar Lakhera
sumber
Berpotensi mengubah cetakan untuk memilih
Tomas Pastircak
3

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
Neeraj Kumar Yadav
sumber
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;

Saya menunjukkan gaji tertinggi ke-3

kiran lanke
sumber
3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'
Vikas Joshi
sumber
3

- gaji tertinggi ke-n

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

- (nth -1) gaji tertinggi

select * 
from employee e1
where 1 = (select count(distinct salary)  
           from employee e2
           where e2.Salary > e1.Salary )
Surya-AIS
sumber
3

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

Kishor Vitekar
sumber
ya! Ini solusi yang sangat sederhana dan bersih.
Avnish alok
3

Untuk mendapatkan nilai tertinggi ketiga dari tabel

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
jitendra rajput
sumber
PILIH Nama kolom yang berbeda DARI tableName ORDER BY columnName DESC LIMIT 2, 1
Devendra Singraul
2

Menurut subkueri:

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

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

Mayur Sawant
sumber
1
set @n = $n

SELECT a.* FROM ( select a.* , @rn = @rn+1  from EMPLOYEE order by a.EmpSalary desc ) As a  where rn = @n
Saurabh Chandra Patel
sumber
1

Solusi yang diuji MySQL, asumsikan N = 4:

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

Contoh lain:

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

Coba kode ini: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )
Deepak Kumar
sumber
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);

Gantikan n dengan gaji tertinggi ke-n sebagai angka.

Ajay Singh Meena
sumber
0

Coba yang ini...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
Deepak Kumar
sumber
0
select 
    Min(salary) 
from ( select salary from employees order by salary desc) t
where rownum<=3;

Untuk gaji tertinggi ke-2, Ubah 3 menjadi 2 dalam query di atas dan untuk gaji tertinggi ke-N ke N di mana N = 1,2,3,4 ....

pelajar
sumber
0

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.

Saif Grover
sumber
0

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

Hardik Masalawala
sumber
0

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.

Ankit Gupta
sumber