একটি সারণীতে দ্বিতীয় সর্বোচ্চ মান পান


14
id value
1   50
2   60
3   55

select max(value) from tablename;

সাধারণত আমরা জানি, আমরা 60 পাব, তবে আমার পরবর্তী মান 55 লাগবে।

এসকিউএল ব্যবহার করে আমি কীভাবে 55 মান পাব?

উত্তর:


24

সর্বোচ্চ মানটি একবারে ঘটেছিল তা ধরে নিলে, অন্য OFFSETউপায়টি ব্যবহার করা হবে (এসকিউএল সার্ভার ২০১২ বা তার পরে):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;

23

সারণীতে দ্বিতীয় সর্বোচ্চ স্বতন্ত্র মান পেতে আপনি ব্যবহার করতে পারেন

SELECT MIN(value)
FROM   (SELECT DISTINCT TOP (2) value
        FROM   tablename
        ORDER  BY value DESC)T
/*If only one distinct value return nothing. */
HAVING MIN(value) <> MAX(value);

13

একটি জেনেরিক সমাধান নীচের মত হতে পারে:

;WITH CTE AS
(
    SELECT
        Col1
        , Col2
        , <AnyColumns>
        , ROW_NUMBER() OVER (ORDER BY <AnyColumns>) AS RowNum
    FROM <YourTable>
    WHERE <YourCondition>
)
SELECT *
FROM CTE
WHERE RowNum = 2 -- Or any condition which satisfies your problem

এখানে আপনি পছন্দগুলি পরিসীমাও নির্ধারণ করতে পারেন RowNum >= 10 AND RowNum <= 20। এবং এটি আপনাকে সমস্ত প্রয়োজনীয় কলামগুলির সাথে 10 তম থেকে 20 তম সারি দেবে।


7

আপনার যথারীতি শীর্ষ কৌশল যেমন:

select top 1 *
from (
    select top 2 *
    from my_table
    order by value desc
    ) t 
order by value asc 

অথবা আপনি সিটিই এর মতো ব্যবহার করতে পারেন:

with CTE as
(
select value, ROW_NUMBER() over(order by value desc) as ord_id
from my_table
)
select value
from CTE
where ord_id = 2

অথবা, যদি আপনি এসকিউএল সার্ভারের (> = 2012) সাম্প্রতিক সংস্করণটি ব্যবহার করেন তবে ল্যাগ ফাংশন।

SELECT  top 1  lag(value, 1,0) OVER (ORDER BY value)  
FROM my_table
order by value desc

5

আমি এই মত করব:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)

1

আপনি ROW_NUMBER()উইন্ডোটিং ফাংশনটিও ব্যবহার করতে পারেন । আপনি যদি আপনার টার্গেট মান দ্বারা অর্ডার করা হয় তবে আপনি 2 তম এন্ট্রি পেতে চান, আপনি এটি করতে পারেন:

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
) d
WHERE RN = 2

এখন আপনি যদি ২ য় সর্বোচ্চ মান পেতে চান এবং আপনার নকল রয়েছে, আপনি মান এন্ট্রি দ্বারা গোষ্ঠী করতে চান যাতে আপনি কেবল স্বতন্ত্র মান পেতে পারেন।

SELECT value 
FROM (
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY NULL ORDER BY value DESC) as RN,
        value
    FROM my_table
    GROUP BY value
) d
WHERE RN = 2

আপনার MIN(id)যদি দ্বিতীয় সর্বোচ্চ মান সহ প্রথম রেকর্ডের আইডি জানতে হবে (ধরে নেওয়া উচিত যে আপনার কাছে দুটি 60s এবং দুটি 55s সহ একটি ডেটা সেট রয়েছে) তবে আপনার অভ্যন্তরীণ নির্বাচনের একটি অন্তর্ভুক্ত করার জন্য আপনার এই পদ্ধতির পরিবর্তন করতে সক্ষম হওয়া উচিত


5
দ্বিতীয় সর্বোচ্চ জন্য এটি সহজ শুধু প্রতিস্থাপন ROW_NUMBER()সঙ্গে DENSE_RANK()- আপনার কাছে বিনামূল্যে জন্য সব অন্যান্য কলাম পেতে। ব্যবহার করার দরকার নেই GROUP BY
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.