programing

급여표에서 세 번째 또는 네 번째 최대 급여를 찾는 방법은 무엇입니까?

linuxpc 2023. 5. 21. 11:00
반응형

급여표에서 세 번째 또는 네 번째 최대 급여를 찾는 방법은 무엇입니까?

급여에서 세 번째 또는th 최대 급여를 찾는 방법table(EmpID, EmpName, EmpSalary)최적화된 방법으로?

행 번호:

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

사용하다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

사용해 보세요.

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

3의 경우 모든 값을 바꿀 수 있습니다...

최적화 방법을 원하는 경우 사용을 의미합니다.TOP키워드, n번째 최대 및 최소 급여는 다음과 같이 쿼리하지만 집계 함수 이름을 사용하는 역순으로 쿼리가 까다로워 보입니다.

N 최대 급여:

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) 

N 최저 급여:

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
);

여기서 LIMIT 제약 조건 뒤에 n번째 값을 변경하면 됩니다.

이 하위 질의에서는 EmpSalary DESC Limit 3의 직원 주문에서 EmpSalary를 선택합니다. 직원의 상위 3개 급여를 반환합니다.결과 중 MIN 명령어를 사용하여 최소 급여를 선택하여 직원의 세 번째 TOP 급여를 받을 것입니다.

N을 최대 번호로 바꾸기

SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)

설명.

위의 쿼리는 이전에 본 적이 없는 경우 상당히 혼란스러울 수 있습니다. 내부 쿼리는 내부 쿼리(하위 쿼리)가 WHERE 절에서 외부 쿼리(이 경우 Emp1 테이블)의 값을 사용하기 때문에 상관 하위 쿼리라고 합니다.

출처

하위 쿼리를 사용하지 않고 급여 테이블에서 세 번째 또는 n번째 최대 급여

select salary from salary
   ORDER   BY salary DESC
   OFFSET  N-1 ROWS
   FETCH NEXT 1 ROWS ONLY

세 번째로 높은 연봉의 경우 N-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;

연봉을 하십시오.n번째로 높은 연봉을 받으려면 다음 질문을 참조하십시오.이를 통해 MYSQL에서 n번째로 높은 급여를 받게 됩니다.만약 당신이 가장 낮은 급여만 받기를 원한다면, 당신은 질의에서 DESC를 ASC로 대체해야 합니다. n번째로 높은 봉급

방법 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 Server 2012에서는 LAG()를 사용하여 보다 직관적으로 이 작업을 수행할 수 있습니다.

SQL Server의 관점에서 이 질문에 답하면 SQL Server 섹션에 나와 있습니다.

N번째 급여를 받는 방법에는 여러 가지가 있으며 이러한 접근 방식을 ANSI SQL 접근 방식과 TSQL 접근 방식을 사용하는 두 개의 섹션으로 분류할 수 있습니다.실질적으로 보여주는 이 최고 연봉 유튜브 영상도 확인할 수 있습니다.이 SQL을 작성하는 세 가지 방법을 살펴보겠습니다.

  • 접근법 1번: - ANSI SQL: - 단순 정렬 기준 및 상위 키워드 사용
  • 접근법 2: - ANSI SQL: - Co 관련 하위 쿼리 사용.
  • 접근 번호 3: - TSQL: - 다음 가져오기 사용

여기에 이미지 설명 입력

접근 번호 1: - 간단한 순서 기준 및 상단 사용.

이 접근 방식에서는 order by 및 top 키워드의 조합을 사용합니다.우리는 우리의 사고 과정을 4단계로 나눌 수 있습니다: -

1단계: - 내림차순 : - 우리가 가진 데이터가 무엇이든 간에 먼저 절별 순서를 사용하여 내림차순으로 만듭니다.

2단계:- 그런 다음 TOP 키워드를 사용하고 TOP N을 선택합니다.여기서 N은 당신이 원하는 최고 연봉 순위를 나타냅니다.

3단계: - 오름차순: - 데이터를 오름차순으로 만듭니다.

4단계:- 상위 1개를 선택합니다.여기까지입니다.

여기에 이미지 설명 입력

따라서 SQL에서 위의 4가지 논리적 단계를 내려놓으면 아래와 같은 결과가 나옵니다.

여기에 이미지 설명 입력

아래는 당신이 SQL을 실행하고 테스트하기를 원하는 경우의 SQL 텍스트입니다.

EmployeeSalary asc의 내부 쿼리 순서로 from(tblEmployeeSalarydesc에서 tblEmployeeSalarydesc에서 top 2 EmployeeSalary 선택)을 선택합니다.

접근법 번호 1의 매개변수화 문제

접근법 1의 가장 큰 문제 중 하나는 "파라미터화"입니다.

위의 SQL을 저장 프로시저로 마무리하여 원하는 최고 연봉을 매개변수로 입력하고자 하는 경우 1번 접근법으로는 어려울 것입니다.

1번 접근법으로 할 수 있는 것 중 하나는 동적 SQL을 만드는 것이지만 이는 우아한 솔루션이 아닙니다.ANSI SQL 접근법인 접근법 2번을 확인해 보겠습니다.

접근법 2: - Co 관련 하위 쿼리 사용.

다음은 공동 관련 하위 쿼리 솔루션의 모습입니다.Co 관련 하위 쿼리가 처음인 경우.공동 관련 하위 쿼리는 쿼리 내부에서 쿼리하는 쿼리입니다.외부 쿼리는 먼저 레코드를 평가하고, 내부 쿼리로 보내고, 내부 쿼리는 레코드를 평가하여 외부 쿼리로 보냅니다.

우리가 알고 싶은 최고 연봉은 쿼리의 "3"입니다.

E1을 선택합니다.tbl의 직원 급여E1(여기서 3=(카운트 선택)은 E2(E2))의 tblEmployee(tblEmployee)입니다.직원 급여>=E1.종업원급여)

그래서 위 쿼리에서 우리는 외부 쿼리를 가지고 있습니다:-

E1을 선택합니다.tbl직원 급여E1

내부 쿼리는 where 절에 있습니다.외부 테이블 별칭을 where 절에서 참조하는 방법을 나타내는 BOLD를 확인하여 공동 관련 내부 및 외부 쿼리를 앞뒤로 평가합니다.

여기서 3=(카운트 선택(*)을 E2로 tblEmployee에서 E2로 지정합니다.직원 급여>=E1.종업원급여)

이제 3000, 4000, 1000 및 100과 같은 레코드가 있다고 가정해 보겠습니다. 아래의 단계는 다음과 같습니다.

  1. 처음 3000은 내부 쿼리로 전송됩니다.
  2. 내부 쿼리는 이제 3000보다 크거나 같은 레코드 값의 수를 확인합니다.레코드 카운트 수가 동일하지 않으면 다음 값인 4000이 사용됩니다.이제 3000의 경우 3000 및 4000보다 크거나 같은 값은 2개뿐입니다.그렇다면, 숫자 기록은 2>-=3인가요?아니요, 따라서 두 번째 값인 4000이 필요합니다.
  3. 다시 4000의 경우 레코드 값이 더 크거나 같은 개수입니다.레코드 카운트 수가 동일하지 않으면 다음 값인 1000이 사용됩니다.
  4. 이제 1000에는 1000보다 크거나 같은 레코드가 3개 있습니다(3000,4000 및 1000 자체).여기서 상관 관계가 중지 및 종료되고 최종 출력이 제공됩니다.

여기에 이미지 설명 입력

접근 번호 3: - TSQL 가져오기 및 다음.

세 번째 접근 방식은 TSQL을 사용하는 것입니다.Fetch와 Next를 사용하면 N번째로 높은 값을 쉽게 얻을 수 있습니다.

그러나 TSQL 코드는 다른 데이터베이스에서는 작동하지 않으므로 전체 코드를 다시 작성해야 합니다.

3단계 프로세스가 될 것입니다.

1단계 내림차순 구분순서: - 먼저 구분 및 순서를 적용하여 급여를 내림차순으로 하고 중복된 부분을 제거합니다.

2단계 간격띄우기 사용: - TSQL 간격띄우기를 사용하여 맨 위의 N-1 행을 가져옵니다.여기서 N은 우리가 받고 싶은 가장 높은 연봉입니다.간격띄우기는 지정된 행 수를 사용하고 다른 행은 그대로 둡니다.0부터 시작하기 때문에 왜 (N-1)입니까?

3단계 Fetch 사용: - Fetch를 사용하여 첫 번째 행을 가져옵니다.저 줄이 연봉이 가장 높습니다.

여기에 이미지 설명 입력

SQL은 아래와 같이 보입니다.

여기에 이미지 설명 입력

실적비교

성능 비교를 위한 SQL 계획은 아래와 같습니다.아래는 탑과 오더 바이에 대한 계획입니다.

여기에 이미지 설명 입력

아래는 공동 관련 쿼리에 대한 계획입니다.연산자의 수가 상당히 많은 것을 알 수 있습니다.따라서 확실히 공동 관련은 거대한 데이터에 나쁜 영향을 미칠 것입니다.

여기에 이미지 설명 입력

아래는 상관관계보다 더 나은 TSQL 질의 계획입니다.

여기에 이미지 설명 입력

따라서 요약하면 아래 표와 같이 보다 전체적으로 비교할 수 있습니다.

여기에 이미지 설명 입력

declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR   ORDER BY GRN_NAME DESC
print @maxNthSal

표에서 세 번째로 높은 값을 가져오는 방법

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

이 질문은 SQL 인터뷰에서 자주 사용되는 질문 중 하나입니다.열의 n번째로 높은 값을 찾기 위해 다른 쿼리를 적을 것입니다.

아래 스크립트를 실행하여 "Emloyee"라는 이름의 테이블을 만들었습니다.

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)

이제 다른 쿼리를 사용하여 위의 표에서 세 번째로 높은 Basic_sal을 알아보겠습니다.저는 매니지먼트 스튜디오에서 아래의 쿼리를 실행했고 아래의 결과입니다.

select * from Employee order by Basic_Sal desc

위의 이미지에서 세 번째로 높은 기본급은 8500임을 알 수 있습니다.저는 같은 일을 하는 세 가지 다른 방법을 쓰고 있습니다.아래에 언급된 세 가지 쿼리를 모두 실행하면 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 TOP 1 Salary as '3rd Highest Salary' from (SELECT DISTINCT TOP 3 Salary from Employee ORDER BY Salary DESC) a ORDER BY Salary ASC;

저는 세 번째로 높은 연봉을 받고 있습니다.

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

--n번째로 높은 연봉

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

--(n-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 salary from
(SELECT rownum ID, EmpSalary salary from
(SELECT DISTINCT EmpSalary from salary_table order by EmpSalary DESC)
where ID = nth)

이 쿼리 사용

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

MySQL 테스트를 거친 솔루션, N = 4:

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

다른 예:

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

이 코드를 사용해 보십시오.

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

표에서 N번째로 높은 급여를 찾습니다.dense_rank() 함수를 사용하여 이 작업을 수행하는 방법은 다음과 같습니다.

여기에 이미지 설명 입력

select linkorder from u_links

select max(linkorder) from u_links

select max(linkorder) from u_links where linkorder < (select max(linkorder) from u_links)

select top 1 linkorder 
       from ( select distinct top 2 linkorder from u_links order by linkorder desc) tmp 
order by linkorder asc

DENSE_RANK : 1. DENSE_RANK는 정렬된 행 그룹의 행 순위를 계산하고 순위를 NUMBER로 반환합니다.순위는 1.2로 시작하는 연속 정수입니다.이 함수는 인수를 모든 숫자 데이터 형식으로 받아들이고 NUMBER를 반환합니다. 3. DENSE_RANK는 order_by_clause의 value_exprs 값을 기준으로 다른 행에 대한 쿼리에서 반환된 각 행의 순위를 계산합니다.위 쿼리에서 직원 테이블의 판매를 기준으로 순위가 반환됩니다.동점일 경우 모든 행에 동일한 순위를 할당합니다.

WITH result AS ( 
     SELECT linkorder ,DENSE_RANK() OVER ( ORDER BY linkorder DESC ) AS  DanseRank 
FROM u_links ) 
SELECT TOP 1 linkorder FROM result WHERE DanseRank = 5

SQL Server 2012+에서 OFFSET...FETCH는 이를 달성하는 효율적인 방법입니다.

DECLARE @N AS INT;
SET @N = 3;

SELECT
    EmpSalary
FROM
    dbo.Salary
ORDER BY
    EmpSalary DESC
OFFSET (@N-1) ROWS
FETCH NEXT 1 ROWS ONLY
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번째로 높은 급여를 숫자로 대체합니다.

SELECT TOP 1 salary FROM ( SELECT TOP n salary FROM employees ORDER BY salary DESC Group By salary ) AS emp ORDER BY salary ASC

(n번째 최대 급여의 경우 n)

내부 쿼리 값만 변경합니다. 예: Student_Info 클래스별 순서에서 Top (2)* 선택아이디 설명

두 문제 모두에 사용:

Select Top (1)* from 
(
 Select Top (1)* from Student_Info order by ClassID desc 
) as wsdwe
order by ClassID 

언급URL : https://stackoverflow.com/questions/16234983/how-to-find-third-or-n%e1%b5%97%ca%b0-maximum-salary-from-salary-table

반응형