Maaş tablosundan üçüncü veya nci maksimum maaş nasıl bulunur?


Yanıtlar:


83

Kullanım ROW_NUMBERya 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

tablodan asgari ücret kaydı nasıl alınır? ins.KYS_ID, ins.FKYS_INS_ID'yi cmn_pat_x_insurance ins.FKYS_PAT_ID = '1253_717' ve ins.FKYS_INS_TYPE in (1) ve ins.BOL_TYPE in (1,3) ve ins.salary in (min (ins.salary)) arasından seçin
saidesh kilaru

Düşünün, çalışan tablosunda 10.0000 kayıt var. Yukarıdaki sorguyu kullanırsam performans 6-10 kat azalacaktır.
Bimal Das

1
@BimalDas: o zaman EmpSalarysütunda bir dizininiz yok . Ayrıca neye göre azaldı? ROW_NUMBERYaklaşı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.
Tim Schmelter

CTE İLE @TimSchmelter, ilk SELECT ifadesinin tüm verilerini depolamak için geçici bir tablo oluşturacak, ardından sonuçtan "SELECT EmpID, EmpName, EmpSalary FROM CTE WHERE RN = @NthRow" seçeneğini seçeceğiz. Bu yüzden sanırım biraz yavaş. Ben kontrol ettim. ve ayrıca uygun indekslemem var.
Bimal Das

2
@BimalDas: Hayır, geçici bir tablo oluşturmuyor. Bir cte normalde herhangi bir yerde gerçekleştirilmez. Daha çok bir satır içi görünüm veya adlandırılmış alt sorgu gibidir.
Tim Schmelter

89

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

tablodan asgari ücret kaydı nasıl alınır? ins.FKYS_PAT_ID = '1253_717' ve ins.FKYS_INS_TYPE in (1) ve ins.BOL_TYPE in (1,3) ve ins.salary in (min (ins.salary)) olduğu cmn_pat_x_insurance ins'ından ins.KYS_ID, ins.FKYS_INS_ID seçin
saidesh kilaru

Kumar ve Alexander, onunla bir alan daha almak istiyorum, bunu nasıl yapacağım? Sorgum "" "İlk 1 Not Kimliğini Seçin (TarihDiff (Yıl, ZamanlamaTarihi, Geçerli_TimeStamp) öğesini [dbo] 'dan Farklı İlk 3 Not Kimliği Olarak Seçin. [DocSecheduale] Not Kimliğine Göre Sırala) Not Kimliğine Göre Sırala" ""
Zaveed Abbasi

En yüksek maaşı buluyorum ancak alt sorguyu anlamak için karmaşık bir hal alıyorum, alt sorguyu açıklamak ister misiniz ...
Deepak Gupta

@deepak_java, bir satır dış sorgu tarafından her işlendiğinde alt sorgu değerlendirilir. Diğer bir deyişle, iç sorgu da Emp1 değerini kullandığından, iç sorgu dış sorgudan bağımsız olarak işlenemez.
Kumar Manish

Neden ... WHERE (N-1) = (Subquery)...işe yaradığını anlamak önemlidir . Alt sorgu, WHEREyan tümcesi Emp1ana 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 > 8000 olacaktır. 4. maaş değeri (750) ... WHERE Emp2.Salary > 7502 veya N olacaktır. -1, dolayısıyla bu satır döndürülecektir.
jerrymouse

66

Bunu dene

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

3 için herhangi bir değeri değiştirebilirsiniz ...


bu oracle 10g veya 11g ile çalışır mı? Yoksa bunun gibi güzel bir alternatif var mı?
RBz

42

Optimize etme yöntemi istiyorsanız TOPAnahtar 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)

En basit ve hatırlaması en kolay. +1
Sнаđошƒаӽ

4
neden ASC sırasına göre yaptığımız maksimum maaşı almak için DESC sırasına göre yapılması gerekiyor, eğer bu 7000,10000,11000,500,800,900,12000 gibi bir maaşımız varsa, o zaman iç sıralama sorgusu ilk 3 ile sonuçlanacak, bu da 500,800,900 anlamına gelir ve bunların maksimum 900, ancak 900 maksimum 3 değil, 3 maksimum maaş 10000'dir.
Narendra Jaggi

1
Örn: 3 maksimum maaş: Şu şekilde olmalıdır En az (İşgücü) İşyerinde Maaş SEÇİN (İşe Göre Maaş SİPARİŞİNE GÖRE İLK 3 İşgücü SEÇİN)
Jimit Rupani

15

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.


Bu hatayı alıyorum. Hata Kodu: 1248 Her türetilmiş tablonun kendi takma adı olmalıdır

buna bir takma ad ekleyin .. (ÇALIŞAN SİPARİŞİNE GÖRE SİPARİŞ TANIMLAMA SINIRI 3) seçeneğinden MIN (İş Maaşı) öğesini s olarak SEÇİN;
anonxss

Yinelemelerden kaçınmak için DISTINCT kullanın (Çalışan SİPARİŞİNDEN (ÇALIŞAN SİPARİŞİNDEN (ÇALIŞAN SİPARİŞİ (EmpSalary)) SEÇİMİ MIN (EmpSalary)) DESC LIMIT 3);
Kalpesh Parikh

14

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


+1 Neden ... WHERE (N-1) = (Subquery)...işe yaradığını anlamak önemlidir . Alt sorgu, WHEREyan tümcesi Emp1ana 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 > 8000 olacaktır. 4. maaş değeri için (750) ... WHERE Emp2.Salary > 7502 veya N olacaktır -1, dolayısıyla bu satır döndürülecektir.
jerrymouse

13

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


3
OFFSET FETCH'in SQL Server 2012 + sürümünde mevcut olduğunu belirtmek önemlidir.
Zerotoinfinity

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

1
Teşekkürler DENSE_RANK () için hiç duymadım
Vivekh

8

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. n'inci en yüksek maaş


1
Soru MySQL ile değil SQL-Server ile ilgili.
bummi


6

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

Yöntem 1 sıralanabilir: İLK 1 MAAŞI SEÇİN (ÇALIŞANLARDAN İLK 3 MAAŞI SEÇİN) * neden - çünkü varsayılan olarak artan düzen
Ashish Agrawal Yodlee

5

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.



3

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

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. en yüksek maaşı gösteriyorum


3
SELECT MIN(COLUMN_NAME)
FROM   (
           SELECT DISTINCT TOP 3     COLUMN_NAME
           FROM   TABLE_NAME
           ORDER BY
                  COLUMN_NAME        DESC
       ) AS 'COLUMN_NAME'

3

en yüksek maaş

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

- (nth -1) en yüksek maaş

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


3

Tablodan üçüncü en yüksek değeri almak için

SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1

Tablo Adından Farklı Sütun Adını SEÇİN SİPARİŞE GÖRE SIRA SIRA SINIRI 2, 1
Devendra Singraul

2

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)

1

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


1
set @n = $n

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

1

MySQL test edilmiş çözüm, N = 4 olduğunu varsayalım:

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

Başka bir örnek:

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

1

Bu kodu deneyin: -

SELECT *
   FROM one one1
   WHERE ( n ) = ( SELECT COUNT( one2.salary )
                   FROM one one2
                   WHERE one2.salary >= one1.salary
                 )

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'yi sayı olarak n'inci en yüksek maaşla değiştirin.


0

Bunu dene...

SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)

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

2. en yüksek maaş için, yukarıdaki sorguda 3'ü 2'ye ve N'inci en yüksek maaşı N olarak değiştirin, burada N = 1,2,3,4 ....


0

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.


0

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


0

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.