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?
sumber
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?
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);
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.
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
Saya akan melakukan ini:
SELECT MAX(value)
FROM tablename
WHERE value < (SELECT MAX(value)
FROM tablename)
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)
ROW_NUMBER()
denganDENSE_RANK()
- Anda juga mendapatkan semua kolom lainnya secara gratis. Tidak perlu digunakanGROUP BY
.