Dapatkan nilai tertinggi kedua dalam tabel

14
id value
1   50
2   60
3   55

select max(value) from tablename;

Secara umum kita tahu, kita akan mendapatkan 60, tetapi saya membutuhkan nilai berikutnya 55.

Bagaimana cara mendapatkan nilai 55 menggunakan SQL?

Mahfuz Morshed
sumber

Jawaban:

24

Dengan asumsi nilai tertinggi hanya terjadi sekali, cara lain adalah menggunakan OFFSET(SQL Server 2012 atau lebih baru):

SELECT * 
FROM tablename
ORDER BY column DESC 
OFFSET 1 ROW 
FETCH NEXT 1 ROW ONLY;
Renato Afonso
sumber
23

Untuk mendapatkan nilai berbeda tertinggi kedua dalam tabel yang dapat Anda gunakan

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);
Martin Smith
sumber
13

Solusi umum dapat seperti di bawah ini:

;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

Di sini Anda juga dapat menentukan rentang suka RowNum >= 10 AND RowNum <= 20. Dan itu akan memberi Anda baris 10 sampai 20 dengan semua kolom yang diperlukan.

SwapnilBhate
sumber
7

Anda memiliki trik paling umum seperti:

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

Atau Anda juga dapat menggunakan CTE seperti:

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

Atau, jika Anda menggunakan versi SQLServer terbaru (> = 2012), fungsi lag .

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

Saya akan melakukan ini:

SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
               FROM tablename)
Amo
sumber
1

Anda dapat menggunakan ROW_NUMBER()fungsi windowing juga. Jika Anda ingin mendapatkan entri ke-2 ketika dipesan berdasarkan nilai target Anda, Anda dapat melakukan:

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

Sekarang jika Anda ingin mendapatkan nilai tertinggi ke-2 dan Anda memiliki duplikat, Anda mungkin ingin mengelompokkan berdasarkan entri nilai sehingga Anda hanya mendapatkan nilai yang berbeda.

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

Anda harus dapat memodifikasi pendekatan ini untuk memasukkan a MIN(id)di dalam pilih jika Anda perlu mengetahui ID dari catatan pertama dengan nilai tertinggi ke-2 (dengan asumsi Anda memiliki satu set data dengan dua 60s dan dua 55s)

CodeMonkey
sumber
5
Untuk tertinggi kedua lebih mudah untuk hanya mengganti ROW_NUMBER()dengan DENSE_RANK()- Anda juga mendapatkan semua kolom lainnya secara gratis. Tidak perlu digunakan GROUP BY.
ypercubeᵀᴹ