最適化された方法で給与table(EmpID,EmpName,EmpSalary)
からthird or nth
の最大給与を見つける方法は?
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 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
これを試して
SELECT TOP 1 salary FROM (
SELECT TOP 3 salary
FROM employees
ORDER BY salary DESC) AS emp
ORDER BY salary ASC
3の場合は、任意の値を置き換えることができます...
最適化方法が必要な場合はTOP
キーワードを使用します。したがって、n番目のmaxとminの給与は次のように照会されますが、集約関数名を使用すると逆の順序で照会が複雑になります。
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によるEmployee OrderからEmpSalaryの選択」を参照してください。DESC制限3。従業員の上位3位の給与を返します。結果から、MINコマンドを使用して最小給与を選択して、従業員の3番目のTOP給与を取得します。
Nをあなたの最大数に置き換えてください
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
説明
上記のクエリは、これまでに見たことがない場合は非常に混乱することがあります。内側のクエリ(サブクエリ)は外側のクエリ(この場合はEmp1テーブル)の値を使用するため、内側のクエリは相関サブクエリと呼ばれます。 )WHERE句です。
そして出典
副問合せを使用せずに給与表から3番目またはn番目の最大給与
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
3番目に高い給料のためにN-1の代わりに2を入れる
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
N番目に高い給料を得るために次の質問を参照してください。このようにしてあなたはMYSQLでn番目に高い給与を得る。 n番目に低い給与だけを取得したい場合は、照会でDESCをASCに置き換える必要があります。
方法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
SELECT EmpSalary
FROM salary_table
GROUP BY EmpSalary
ORDER BY EmpSalary DESC LIMIT n-1, 1;
2008年には、ROW_NUMBER()OVER(ORSER 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()を使用してより直感的に実行されます。
declare @maxNthSal as nvarchar(20)
SELECT TOP 3 @maxNthSal=GRN_NAME FROM GRN_HDR ORDER BY GRN_NAME DESC
print @maxNthSal
- 給与の最高額
select *
from (select lstName, salary, row_number() over( order by salary desc) as rn
from employee) tmp
where rn = 2
- (nth -1)最高給与
select *
from employee e1
where 1 = (select count(distinct salary)
from employee e2
where e2.Salary > e1.Salary )
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番目に高い給料を見せています
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
これはSQLインタビューでよく寄せられる質問の1つです。列のn番目に高い値を見つけるために、さまざまなクエリを書き留めます。
以下のスクリプトを実行して、「Emloyee」という名前のテーブルを作成しました。
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
では、下記のinsert文を実行して、このテーブルに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)
さて、上の表から異なるクエリを使って3番目に高いBasic_salを見つけます。以下のクエリをManagement Studioで実行しましたが、結果は以下のとおりです。
select * from Employee order by Basic_Sal desc
上の画像から、3番目に高い基本給が8500になることがわかります。同じことをする3つの異なる方法を書いています。下記の3つのクエリをすべて実行することで、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
最適化された方法:サブクエリの代わりにlimitを使うだけです。
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
テーブルから3番目に高い値を取得する
SELECT * FROM tableName ORDER BY columnName DESC LIMIT 2, 1
このコードを試してください: -
SELECT *
FROM one one1
WHERE ( n ) = ( SELECT COUNT( one2.salary )
FROM one one2
WHERE one2.salary >= one1.salary
)
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 A.JID,A.EntryDate,RefundDate,Comments,Refund, ActionBy FROM (
(select JID, Max(EntryDate) AS EntryDate from refundrequested GROUP BY JID) A
Inner JOIN (SELECT JID,ENTRYDATE,refundDate,Comments,refund,ActionBy from refundrequested) B
ON A.JID=B.JID AND A.EntryDate = B.EntryDate)
cTEおよびFIRST_VALUE関数を使用してN番目の最大値を見つけます。 -5番目の最高給与
;WITH CTE_NTH_SAL AS
(SELECT FIRST_VALUE(ESAL) OVER(ORDER BY ESAL DESC) AS ESAL,
1 AS ID
FROM EMPLOYEE
UNION ALL
SELECT FIRST_VALUE(EMP.ESAL) OVER(ORDER BY EMP.ESAL DESC) AS ESAL,
ID
FROM EMPLOYEE EMP,
(SELECT ESAL,
ID+1 AS ID
FROM CTE_NTH_SAL) CTE_NTH_SAL
WHERE EMP.ESAL<CTE_NTH_SAL.ESAL
AND CTE_NTH_SAL.ID<=5 )
SELECT DISTINCT ESAL
FROM CTE_NTH_SAL
WHERE ID=5
サンプルの結果セットとその他の方法 clickhere
テーブルから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の値に基づいて、他の行に対するクエリから返された各行のランクを計算します。 4.上記のクエリでは、ランクは従業員テーブルのsalに基づいて返されます。同点の場合は、すべての行に同じランクが割り当てられます。
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
注:クエリの OFFSET 3 を任意のN番目の整数に置き換えてください。
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
説明
次の1行のみを取得
1行だけ返す
オフセット3行
最初の3レコードを除外ここで、あなたは任意の整数をことができます
これを試すことができます:
select top(1) EXPORT_NO
from DC_HDR
order by CASE when (ROW_NUMBER() over(order by EXPORT_NO desc))=3 then EXPORT_NO else 0 end desc
AdventureWorks2012を使用してnth highest bonus
を問い合わせるには、n=10
とします。次のコードを試してください。
USE AdventureWorks2012;
GO
SELECT * FROM Sales.SalesPerson;
GO
DECLARE @grade INT;
SET @grade = 10;
SELECT MIN(Bonus)
FROM (SELECT TOP (@grade) Bonus FROM (SELECT DISTINCT(Bonus) FROM Sales.SalesPerson) AS a ORDER BY Bonus DESC) AS g
select
Min(salary)
from ( select salary from employees order by salary desc) t
where rownum<=3;
2番目に高い給与の場合は、上記の照会で3から2に変更し、N番目の最も高い給与の場合はN = 1,2,3,4 ...に変更します。
SELECT * FROM(給与のDESCで顧客の注文から個別の給与を選択する)制限4,1。
制限4,1は、最初の4行を残してから次の行を選択することを意味します。
上限と下限は、使用しているプラットフォームによって異なります。
これを試してください、それはうまくいくでしょう。
これを試してください...
SELECT MAX(salary) FROM employee WHERE salary NOT IN (SELECT * FROM employee ORDERBY salary DESC LIMIT n-1)
select min(salary)
from (select salary
from employee
where rownum < n+1
order by salary desc);
3番目に高い給与をすべて表示:
select * from emp where sal=
(SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ;
3番目に高い給与のみを表示します。
SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1
サブクエリは常にもっと時間がかかります。
以下のクエリを使用して、最高値と最低値のデータを取得します。
最も高いデータ:select *from business order by id desc limit 3,1;
最も低いデータ:select *from business order by id asc limit 3,1;
N番目のデータを取得するために3の代わりにNを使用できます。
// 2番目に高い給与を取得する場合は、table。
SELECT * FROM tablename t1
WHERE (N-1) = (SELECT COUNT(DISTINCT(t2.Salary))
FROM tablename t2
WHERE t2.Salary > t1.Salary)