দ্বিতীয় বৃহত্তম মান খুঁজে পেতে সহজতম এসকিউএল কোয়েরিটি কী?


168

নির্দিষ্ট কলামে দ্বিতীয় বৃহত্তম পূর্ণসংখ্যার মান সর্বাধিক সহজ এসকিউএল কোয়েরিটি কী?

কলামে সম্ভবত সদৃশ মান রয়েছে।


। এই purpos ... [dbo] থেকে নির্বাচন করা এক্সটেনশানটির অফসেট ব্যবহার [এমপ্লয়িজ] অর্ডার এক্সটেনশন নিম্নক্রমে পুষিয়ে 2 সারি পরবর্তী 1 সারি শুধুমাত্র আনা
Jinto জন

উত্তর:


294
SELECT MAX( col )
  FROM table
 WHERE col < ( SELECT MAX( col )
                 FROM table )

7
ম্যাট এর পাশাপাশি বিনয়ের উত্তরও সদৃশদের যত্ন নেয়। ধরুন বৃহত্তম মান তারপর পুনরাবৃত্তি করা হয় ম্যাট এর উত্তর ব্যবহার করার সময় যদি আপনি ব্যবহার সঠিক দ্বিতীয় বৃহত্তম মান উত্পাদন করা হবে শীর্ষ 2 নিম্নক্রমে এবং সর্বনিম্ন পদ্ধতির, আপনি বৃহত্তম মান পরিবর্তে পেতে পারেন।
পঙ্কজ শর্মা

যদি সেখানে একাধিক দ্বিতীয় সর্বোচ্চ থাকে ... তবে এটি সমস্ত টিপল দেয় না
পার্থ সাতরা

2
আপনাকে ধন্যবাদ, এখানে
শাইজুত

অভ্যন্তরীণ বিবৃতিটির জন্য ORDER_BY এবং LIMIT ব্যবহার করে আমার পদ্ধতির চেয়ে অনেক বেশি ভাল
অ্যান্ডিগ

নোট করুন যদি অনুরোধের আগে কোনও রেকর্ড না থাকে তবে এটি কোনও ফলাফল ফিরিয়ে দেবে না।
অ্যান্ডিগ


31

টি-স্কেলে দুটি উপায় রয়েছে:

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

মাইক্রোসফ্ট এসকিউএল-তে প্রথম উপায়টি দ্বিতীয়টির চেয়ে দ্বিগুণ দ্রুত, এমনকি যদি প্রশ্নযুক্ত কলামটি ক্লাস্টার করা থাকে।

এটি এই কারণে যে সারণি বা সূচক স্ক্যানটি maxসমষ্টিটি ব্যবহার করে তার তুলনায় ক্রমান্বিত অপারেশন তুলনামূলকভাবে ধীর ।

বিকল্পভাবে, মাইক্রোসফ্ট এসকিউএল 2005 এবং তারপরে আপনি এই ROW_NUMBER()ফাংশনটি ব্যবহার করতে পারেন :

select col
from (
    select ROW_NUMBER() over (order by col asc) as 'rowNum', col
    from [table] ) withRowNum 
where rowNum = 2

20

আমি এখানে কিছু এসকিউএল সার্ভার নির্দিষ্ট এবং কিছু মাইএসকিউএল নির্দিষ্ট সমাধান উভয়ই দেখতে পাচ্ছি, যাতে আপনার কোন ডাটাবেসের প্রয়োজন তা আপনি পরিষ্কার করতে চাইতে পারেন। যদিও আমার অনুমান করতেই হবে আমি এসকিউএল সার্ভার বলব যেহেতু এটি মাইএসকিউএলে তুচ্ছ।

আমি এমন কিছু সমাধানও দেখতে পাচ্ছি যা কার্যকর হবে না কারণ তারা সদৃশগুলির সম্ভাবনা বিবেচনায় নিতে ব্যর্থ হয়, তাই আপনি কোনটি গ্রহণ করবেন সে সম্পর্কে সতর্ক থাকুন। পরিশেষে, আমি কয়েকটি দেখতে পাচ্ছি যা কাজ করবে তবে এটি টেবিলের দুটি সম্পূর্ণ স্ক্যান করবে। আপনি নিশ্চিত করতে চান যে ২ য় স্ক্যানটি কেবলমাত্র 2 টি মানকে দেখছে।

এসকিউএল সার্ভার (প্রাক-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

হালনাগাদ:

এসকিউএল সার্ভার ২০১২ এখন অফার / ফেচ সিনট্যাক্সকে অনেক ক্লিনার (এবং মানক ) সমর্থন করে :

SELECT TOP 2 [column] 
FROM [Table] 
GROUP BY [column] 
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;

এই আমি দেখতে আশা ছিল। আপনার যদি কারও জন্য এটির প্রয়োজন হয় তবে গৃহীত উত্তরটি কুশ্রী হয়ে যায় n। এই এক যে পরীক্ষা দাঁড়িয়ে।
রবিন মাবেন

@ রবিনমাবেন রবিন, যখন সর্বাধিক মানটির পুনরাবৃত্তি ঘটে তখন সেই পরিস্থিতি সম্পর্কে কী বলা যায়? মনে করুন কোনও কলামে 1 থেকে 100 পর্যন্ত সংখ্যা রয়েছে তবে 100 বার দুবার পুনরাবৃত্তি করা হয়েছে। তারপরে এই সমাধানটি 100 হিসাবে দ্বিতীয় বৃহত্তম মান উত্পাদন করবে যা ভুল হবে। রাইট?
পঙ্কজ শর্মা

1
@ পঙ্কজশর্মা না, এটি এখনও কাজ করবে, কারণ দফায়
সংঘবদ্ধ

এটি করার জন্য এটি আদর্শ উপায়। গৃহীত উত্তরটি এইটিতে আপডেট করা উচিত।
গিলহার্ম মেলো

1
আমি একটি ত্রুটি পেয়েছি যা বলে যে আমি ব্যবহার করতে পারি না TOPএবং OFFSETএকই ক্যোয়ারিতে।
উত্সাহিত

15

আমি মনে করি আপনি যেমন কিছু করতে পারেন:

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1

অথবা

SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)

আপনার ডাটাবেস সার্ভারের উপর নির্ভর করে। ইঙ্গিত: এসকিউএল সার্ভার সীমাবদ্ধ করে না।


আপডেট- এসকিউএল সার্ভার ২০১২ উপরের ডিবিডিয়ার্সের
ilketocode

ধরুন আপনার কাছে একই মান সহ 2 টি উপাদান রয়েছে তবে সবচেয়ে বড় উপাদানও রয়েছে। আমার অনুমান আপনার করতে হবেOFFSET 2
কংকান

গ্রুপ দ্বারা গ্রুপ যুক্ত করা এতে নকল শর্ত পূরণ করবে।
সাইফ

7

আবেদনে এই ফলাফল সেট থেকে দ্বিতীয় মান পাওয়া সবচেয়ে সহজ হবে:

SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2

তবে আপনাকে যদি এসকিউএল ব্যবহার করে দ্বিতীয় মানটি অবশ্যই নির্বাচন করতে হয় তবে কীভাবে:

SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t

1
আপনি কি এসকিউএল সার্ভারে এটি চালিয়েছেন?
ক্রেগ

1
@ ক্রেইগ - মাইএসকিউএল LIMITসিনট্যাক্স, প্রশ্নটি কোনও এসকিউএল সংস্করণ নির্দিষ্ট করে না।
কিথ

7

নিম্নলিখিত কোয়েরিটি ব্যবহার করে আপনি কলামের দ্বিতীয় বৃহত্তম মানটি পেতে পারেন

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


মৃত লিংক আর্কাইভ: web.archive.org/web/20130406161645/http://...
xgMz

4

দ্বিতীয় বৃহত্তম মানটি খুঁজে পেতে খুব সাধারণ প্রশ্ন query

SELECT `Column` FROM `Table` ORDER BY `Column` DESC LIMIT 1,1;

4

এমএস স্কুয়েল

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

উপ-প্রশ্নের দরকার নেই ... কেবল একটি সারি এড়িয়ে যান এবং নেমে অর্ডার করার পরে দ্বিতীয় সারি নির্বাচন করুন


3
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )

এই ক্যোয়ারী ফলাফল থেকে সর্বোচ্চ বেতন প্রদান করবে - এতে সামগ্রিক সারণী থেকে সর্বাধিক বেতন নেই।


2
এটি কীভাবে পুরানো উত্তরগুলির চেয়ে উল্লেখযোগ্যভাবে আলাদা তা বোঝাতে সম্পাদনা করতে পারেন ?
নাথান টগি 9:59

3

পুরানো প্রশ্ন আমি জানি, তবে এটি আমাকে আরও কার্যকর এক্সপ্ল্যান্ট পরিকল্পনা দিয়েছে:

 SELECT TOP 1 LEAD(MAX (column)) OVER (ORDER BY column desc)
 FROM TABLE 
 GROUP BY column

3

এটি খুব সাধারণ কোড, আপনি এটি ব্যবহার করে দেখতে পারেন: -

উদাহরণস্বরূপ: সারণির নাম = পরীক্ষা

salary 

1000
1500
1450
7500

দ্বিতীয় বৃহত্তম মান পেতে এমএসএসকিউএল কোড

select salary from test order by salary desc offset 1 rows fetch next 1 rows only;

এখানে '1 সারি অফসেট' অর্থ টেবিলের দ্বিতীয় সারি এবং 'কেবল পরবর্তী 1 টি সারি আনুন' কেবল সেই 1 সারি দেখানোর জন্য। যদি আপনি 'কেবল পরের 1 টি সারি আনা' ব্যবহার না করেন তবে এটি দ্বিতীয় সারির সমস্ত সারি দেখায়।


সর্বাধিক অনুকূলিত এবং রিসোর্স বন্ধুত্বপূর্ণ উত্তর। আমি আমার সাবকোয়রিতে এটি ব্যবহার করে অনেক সময় সাশ্রয় করেছি। ধন্যবাদ।
vis2006

2

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

আশা করি যে কোনও সারির মান পেতে এই সহায়তা .....


2

সবচেয়ে সহজ

select sal from salary order by sal desc limit 1 offset 1

1
select min(sal) from emp where sal in 
    (select TOP 2 (sal) from emp order by sal desc)

বিঃদ্রঃ

সাল ইজ কোল নেম
এমপ টেবিলের নাম


1

টম, বিশ্বাস করুন যখন select max([COLUMN_NAME]) from [TABLE_NAME]বিভাগে একাধিক মান ফিরে আসবে তখন এটি ব্যর্থ হবে । অর্থাত্ যেখানে ডেটা সেটে 2 টিরও বেশি মান রয়েছে।

আপনার ক্যোয়ারিতে সামান্য পরিবর্তন কাজ করবে -

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN** 
  ( select max([COLUMN_NAME]) from [TABLE_NAME] )

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

subquery বৃহত্তম ব্যতীত অন্য সমস্ত মান প্রদান করে। প্রত্যাশিত তালিকা থেকে সর্বাধিক মান নির্বাচন করুন।


1
select col_name
from (
    select dense_rank() over (order by col_name desc) as 'rank', col_name
    from table_name ) withrank 
where rank = 2




1

যেমন আপনি সদৃশ মান উল্লেখ করেছেন। সেক্ষেত্রে দ্বিতীয় সর্বোচ্চ মান খুঁজে পেতে আপনি DISTINCT এবং GROUP BY ব্যবহার করতে পারেন

এখানে একটি টেবিল

বেতন

:

এখানে চিত্র বর্ণনা লিখুন

গ্রুপ দ্বারা

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

লিমিটের প্রথম অংশ = সূচনা সূচক

সীমাবদ্ধতার দ্বিতীয় অংশ = কতটি মান


1
SELECT MAX(sal) FROM emp
WHERE sal NOT IN (SELECT top 3 sal FROM emp order by sal desc )

এটি এম্প টেবিলের তৃতীয় সর্বোচ্চ সাল ফিরে আসবে



0

এটার মতো কিছু? যদিও আমি এটি পরীক্ষা করি নি:

select top 1 x
from (
  select top 2 distinct x 
  from y 
  order by x desc
) z
order by x


0

একটি সম্পর্কিত সম্পর্কযুক্ত ক্যোয়ারী ব্যবহার করে:

Select * from x x1 where 1 = (select count(*) from x where x1.a < a)

0
select * from emp e where 3>=(select count(distinct salary)
    from emp where s.salary<=salary)

এই ক্যোয়ারি সর্বোচ্চ তিনটি বেতন নির্বাচন করে se যদি দুটি এমপি একই বেতন পান এটি কোয়েরিতে প্রভাব ফেলবে না।



0

এটি এমএস এসকিউএলে কাজ করে:

select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] < 
 ( select max([COLUMN_NAME]) from [TABLE_NAME] )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.