ما هو أبسط استعلام SQL للعثور على ثاني أكبر قيمة؟
سؤال
ما هو أبسط استعلام SQL للعثور على ثاني أكبر قيمة عددية في عمود معين؟
ربما تكون هناك قيم مكررة في العمود.
المحلول
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
نصائح أخرى
SELECT MAX(col) FROM table WHERE col NOT IN (SELECT MAX(col) FROM table);
في T-Sql هناك طريقتان:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by col desc
في Microsoft SQL، تكون الطريقة الأولى أسرع بمرتين من الطريقة الثانية، حتى لو كان العمود المعني متجمعًا.
وذلك لأن عملية الفرز بطيئة نسبيًا مقارنة بمسح الجدول أو الفهرس الذي يتم إجراؤه max
استخدامات التجميع.
وبدلاً من ذلك، في Microsoft SQL 2005 والإصدارات الأحدث، يمكنك استخدام ملحق ROW_NUMBER()
وظيفة:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
أرى بعض الحلول الخاصة بـ SQL Server وبعض الحلول الخاصة بـ MySQL هنا، لذا قد ترغب في توضيح قاعدة البيانات التي تحتاجها.على الرغم من أنه إذا كان علي أن أخمن فسأقول SQL Server لأن هذا أمر تافه في MySQL.
أرى أيضًا بعض الحلول التي لن تنجح لأنها تفشل في مراعاة إمكانية وجود نسخ مكررة، لذا كن حذرًا بشأن الحلول التي تقبلها.أخيرًا، أرى عددًا قليلًا منها سيعمل ولكن سيؤدي إلى إجراء مسحين كاملين للجدول.تريد التأكد من أن الفحص الثاني يبحث فقط في قيمتين.
خادم SQL (ما قبل 2012):
SELECT MIN([column]) AS [column]
FROM (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
الخلية:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
تحديث:
يدعم SQL Server 2012 الآن برنامجًا أكثر نظافة (و معيار) بناء جملة الإزاحة/الجلب:
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
أفترض أنه يمكنك فعل شيء مثل:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
أو
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
اعتمادا على خادم قاعدة البيانات الخاصة بك.تَلمِيح:SQL Server لا يفعل LIMIT.
يمكنك العثور على ثاني أكبر قيمة للعمود باستخدام الاستعلام التالي
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
يمكنك العثور على مزيد من التفاصيل على الرابط التالي
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
سيكون الأسهل هو الحصول على القيمة الثانية من مجموعة النتائج هذه في التطبيق:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
ولكن إذا كان يجب عليك تحديد القيمة الثانية باستخدام SQL، فماذا عن:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
استعلام بسيط جدًا للعثور على ثاني أكبر قيمة
SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
سيعيد هذا الاستعلام الحد الأقصى للراتب من النتيجة - والذي لا يحتوي على الحد الأقصى للراتب من الجدول الإجمالي.
أعرف السؤال القديم، لكن هذا أعطاني خطة تنفيذية أفضل:
SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
FROM TABLE
GROUP BY column
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
نأمل أن يساعد هذا في الحصول على القيمة لأي صف .....
أبسط من كل شيء
select sal from salary order by sal desc limit 1 offset 1
هذا كود بسيط للغاية، يمكنك تجربة ما يلي:-
السابق :اسم الجدول = test
salary
1000
1500
1450
7500
رمز MSSQL للحصول على ثاني أكبر قيمة
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
هنا يعني "إزاحة الصفوف الأولى" الصف الثاني من الجدول و"جلب الصفوف الأولى التالية فقط" مخصص لإظهار هذا الصف الأول فقط.إذا كنت لا تستخدم خيار "جلب الصفوف التالية فقط" فسيعرض جميع الصفوف من الصف الثاني.
select min(sal) from emp where sal in
(select TOP 2 (sal) from emp order by sal desc)
ملحوظة
سال هو اسم العقيد
emp هو اسم الجدول
توم، أعتقد أن هذا سيفشل عندما يتم إرجاع أكثر من قيمة واحدة select max([COLUMN_NAME]) from [TABLE_NAME]
قسم.أي.حيث يوجد أكثر من قيمتين في مجموعة البيانات.
سيعمل التعديل الطفيف على استعلامك -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
select max(COL_NAME) from TABLE_NAME where COL_NAME in
(select COL_NAME from TABLE_NAME where COL_NAME < (select max(COL_NAME) from TABLE_NAME));
يقوم الاستعلام الفرعي بإرجاع كافة القيم بخلاف القيمة الأكبر.حدد القيمة القصوى من القائمة التي تم إرجاعها.
select col_name
from (
select dense_rank() over (order by col_name desc) as 'rank', col_name
from table_name ) withrank
where rank = 2
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
وهي الطريقة الأسهل:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1
كما ذكرت القيم المكررة.في مثل هذه الحالة يمكنك استخدام متميز و مجموعة من لمعرفة ثاني أعلى قيمة
هنا طاولة
مرتب
:
مجموعة من
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
متميز
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
الجزء الأول من LIMIT = مؤشر البداية
الجزء الثاني من LIMIT = كم قيمة
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )
سيعيد هذا ثالث أعلى سال من جدول emp
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
ماي إس كيو إل
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
لا حاجة للاستعلامات الفرعية ...ما عليك سوى تخطي صف واحد وتحديد الصفوف الثانية بعد الترتيب من خلال التنازل
شيء من هذا القبيل؟لم أختبره رغم ذلك:
select top 1 x
from (
select top 2 distinct x
from y
order by x desc
) z
order by x
يرى كيفية تحديد الصف n في جدول قاعدة بيانات SQL؟.
يدعم Sybase SQL Anywhere:
SELECT TOP 1 START AT 2 value from table ORDER BY value
باستخدام استعلام مترابط:
Select * from x x1 where 1 = (select count(*) from x where x1.a < a)
select * from emp e where 3>=(select count(distinct salary)
from emp where s.salary<=salary)
يحدد هذا الاستعلام الحد الأقصى للرواتب الثلاثة.إذا حصل اثنان من الموظفين على نفس الراتب، فهذا لا يؤثر على الاستعلام.
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc
يعمل هذا في MS SQL:
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] <
( select max([COLUMN_NAME]) from [TABLE_NAME] )
استعلام للعثور على ثاني أعلى رقم على التوالي-
select Top 1 (salary) from XYZ
where Salary not in (select distinct TOP 1(salary) from XYZ order by Salary desc)
ORDER BY Salary DESC
عن طريق تغيير أبرزها Top 1
ل TOP 2
, 3
أو 4
يمكنك العثور على الثالث والرابع والخامس على التوالي.