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?
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:
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;
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
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
.