ما هو أبسط استعلام SQL للعثور على ثاني أكبر قيمة؟

StackOverflow https://stackoverflow.com/questions/32100

  •  09-06-2019
  •  | 
  •  

سؤال

ما هو أبسط استعلام 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

كما ذكرت القيم المكررة.في مثل هذه الحالة يمكنك استخدام متميز و مجموعة من لمعرفة ثاني أعلى قيمة

هنا طاولة

مرتب

:

enter image description here

مجموعة من

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 يمكنك العثور على الثالث والرابع والخامس على التوالي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top