รับค่าสูงสุดอันดับสองในตาราง


14
id value
1   50
2   60
3   55

select max(value) from tablename;

โดยทั่วไปเรารู้ว่าเราจะได้ 60 แต่ฉันต้องการค่าถัดไป 55

ฉันจะรับค่า 55 โดยใช้ SQL ได้อย่างไร

คำตอบ:


24

สมมติว่าค่าสูงสุดเกิดขึ้นเพียงครั้งเดียวจะใช้วิธีอื่นOFFSET(SQL Server 2012 หรือใหม่กว่า):

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 

หรือคุณสามารถใช้ CTE เช่น:

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

หรือถ้าคุณใช้ SQLServer รุ่นล่าสุด (> = 2012) ฟังก์ชันความล่าช้า

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


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

ตอนนี้ถ้าคุณต้องการได้ค่าที่สูงที่สุดเป็นอันดับที่ 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

คุณควรจะสามารถปรับเปลี่ยนวิธีการนี้เพื่อรวม a MIN(id)ในตัวเลือกด้านในหากคุณจำเป็นต้องรู้ ID ของระเบียนแรกที่มีค่าสูงสุดลำดับที่ 2 (สมมติว่าคุณมีชุดข้อมูลที่มีสอง 60 และสอง 55s)


5
สำหรับอันดับที่สองมันง่ายกว่าที่จะแทนที่ROW_NUMBER()ด้วยDENSE_RANK()- คุณจะได้รับคอลัมน์อื่น ๆ ทั้งหมดฟรี GROUP BYไม่จำเป็นต้องใช้
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.