كيفية العثور على third or nth
أقصى راتب من الراتب table(EmpID,EmpName,EmpSalary)
بطريقة محسنة؟
استخدم 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
Keyword ، وبالتالي فإن الاستعلام عن الرواتب القصوى والدقيقة 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)
الحد الأدنى للراتب:
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
);
يمكنك هنا فقط تغيير القيمة nth بعد القيد LIMIT.
في هذا الاستعلام الفرعي ، حدد EmpSalary من Order Employee Order حسب EmpSalary DESC Limit 3؛ سيعود أعلى 3 رواتب الموظفين. من النتيجة ، سنختار الحد الأدنى للراتب باستخدام أمر MIN للحصول على راتب TOP الثالث للموظف.
استبدل N برقمك الأقصى
SELECT *
FROM Employee Emp1
WHERE (N-1) = (
SELECT COUNT(DISTINCT(Emp2.Salary))
FROM Employee Emp2
WHERE Emp2.Salary > Emp1.Salary)
تفسير
يمكن أن يكون الاستعلام أعلاه مربكًا تمامًا إذا لم ترَ شيئًا يشبهه من قبل - الاستعلام الداخلي هو ما يسمى الاستعلام الفرعي المرتبط لأن الاستعلام الداخلي (الاستعلام الفرعي) يستخدم قيمة من الاستعلام الخارجي (في هذه الحالة جدول Emp1 ) في جملة أين.
الحد الأقصى الثالث أو الثالث من الراتب من جدول الرواتب دون استخدام استعلام فرعي
select salary from salary
ORDER BY salary DESC
OFFSET N-1 ROWS
FETCH NEXT 1 ROWS ONLY
للحصول على أعلى راتب 3 ضع 2 في مكان N-1
SELECT Salary,EmpName
FROM
(
SELECT Salary,EmpName,DENSE_RANK() OVER(ORDER BY Salary DESC) Rno from EMPLOYEE
) tbl
WHERE Rno=3
راجع الاستعلام التالي للحصول على أعلى راتب. بهذه الطريقة تحصل على أعلى راتب في MYSQL. إذا كنت ترغب في الحصول على أقل راتب في المرتبة الأولى ، فأنت بحاجة إلى استبدال 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 (ORDER BY EmpSalary DESC) للحصول على تصنيف بدون روابط يمكننا استخدامها.
على سبيل المثال ، يمكننا الحصول على المرتبة الثامنة على هذا النحو ، أو تغيير @ 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
- (رقم -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;
أنا تظهر ثالث أعلى راتب
SELECT MIN(COLUMN_NAME)
FROM (
SELECT DISTINCT TOP 3 COLUMN_NAME
FROM TABLE_NAME
ORDER BY
COLUMN_NAME DESC
) AS 'COLUMN_NAME'
هذا هو أحد الأسئلة الشائعة في أي مقابلة مع SQL. سأقوم بكتابة استفسارات مختلفة لمعرفة القيمة الأعلى للعمود.
لقد قمت بإنشاء جدول يسمى "Emloyee" عن طريق تشغيل البرنامج النصي أدناه.
CREATE TABLE Employee([Eid] [float] NULL,[Ename] [nvarchar](255) NULL,[Basic_Sal] [float] NULL)
الآن سأقوم بإدراج 8 صفوف في هذا الجدول عن طريق تشغيل أدناه عبارة insert.
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. أنا أكتب 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
الطريقة المثلى: بدلاً من الاستعلام الفرعي ، استخدم الحد.
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
للحصول على ثالث أعلى قيمة من الجدول
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)
العثور على أعلى راتب Nth من الجدول. إليك طريقة للقيام بهذه المهمة باستخدام دالة 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 ترتيب كل صف يتم إرجاعه من استعلام فيما يتعلق بالصفوف الأخرى ، استنادًا إلى قيم value_exprs في order_by_clause. 4. في الاستعلام أعلاه ، يتم إرجاع التصنيف بناءً على جدول جدول الموظف. في حالة التعادل ، فإنه يعين رتبة متساوية لجميع الصفوف.
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 في الاستعلام برقم أي عدد صحيح
SELECT EmpName,EmpSalary
FROM SALARY
ORDER BY EmpSalary DESC
OFFSET 3 ROWS
FETCH NEXT 1 ROWS ONLY
الوصف
جلب التالي 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
للاستعلام عن nth highest bonus
، قل n=10
، باستخدام AdventureWorks2012 ، جرب اتباع الكود
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;
للحصول على ثاني أعلى راتب ، قم بتغيير 3 إلى 2 في الاستعلام أعلاه ولأعلى راتب N إلى N حيث N = 1،2،3،4 ....
SELECT * FROM (حدد الراتب المتميز من طلب العملاء حسب الراتب DESC) الحد 4.1
الحد 4،1 يعني ترك الصفوف الأربعة الأولى ثم حدد الصف التالي.
يعتمد الحد والخانة على النظام الأساسي الذي تستخدمه.
جرب هذا ، سوف يعمل.
جرب هذه...
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);
عرض الكل ثالث أعلى راتب:
select * from emp where sal=
(SELECT DISTINCT sal FROM emp ORDER BY sal DESC LIMIT 3,1) ;
عرض فقط ثالث أعلى راتب:
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 للحصول على البيانات nth.