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?

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;

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

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.


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

5

Saya akan melakukan ini:

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

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)


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ᵀᴹ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.