Apa permintaan SQL paling sederhana untuk menemukan nilai integer terbesar kedua di kolom tertentu?
Mungkin ada nilai duplikat di kolom.
Apa permintaan SQL paling sederhana untuk menemukan nilai integer terbesar kedua di kolom tertentu?
Mungkin ada nilai duplikat di kolom.
Jawaban:
SELECT MAX( col )
FROM table
WHERE col < ( SELECT MAX( col )
FROM table )
Dalam T-Sql ada dua cara:
--filter out the max
select max( col )
from [table]
where col < (
select max( col )
from [table] )
--sort top two then bottom one
select top 1 col
from (
select top 2 col
from [table]
order by col) topTwo
order by col desc
Dalam Microsoft SQL cara pertama dua kali lebih cepat daripada yang kedua, bahkan jika kolom tersebut berkerumun.
Ini karena operasi pengurutan relatif lambat dibandingkan dengan pemindaian tabel atau indeks yang max
digunakan agregasi.
Atau, di Microsoft SQL 2005 dan di atas Anda dapat menggunakan ROW_NUMBER()
fungsi:
select col
from (
select ROW_NUMBER() over (order by col asc) as 'rowNum', col
from [table] ) withRowNum
where rowNum = 2
Saya melihat beberapa SQL Server khusus dan beberapa solusi spesifik MySQL di sini, jadi Anda mungkin ingin memperjelas database yang Anda butuhkan. Padahal jika saya harus menebak saya akan mengatakan SQL Server karena ini sepele di MySQL.
Saya juga melihat beberapa solusi yang tidak akan berhasil karena gagal memperhitungkan kemungkinan duplikat, jadi berhati-hatilah mana yang Anda terima. Akhirnya, saya melihat beberapa yang akan bekerja tetapi itu akan membuat dua scan lengkap tabel. Anda ingin memastikan pemindaian ke-2 hanya melihat 2 nilai.
SQL Server (pra-2012):
SELECT MIN([column]) AS [column]
FROM (
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
) a
MySQL:
SELECT `column`
FROM `table`
GROUP BY `column`
ORDER BY `column` DESC
LIMIT 1,1
Memperbarui:
SQL Server 2012 sekarang mendukung sintaks OFFSET / FETCH yang jauh lebih bersih (dan standar ):
SELECT TOP 2 [column]
FROM [Table]
GROUP BY [column]
ORDER BY [column] DESC
OFFSET 1 ROWS
FETCH NEXT 1 ROWS ONLY;
n
. Yang ini tahan uji itu.
TOP
dan OFFSET
dalam permintaan yang sama.
Saya kira Anda dapat melakukan sesuatu seperti:
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT 1 OFFSET 1
atau
SELECT * FROM Table ORDER BY NumericalColumn DESC LIMIT (1, 1)
tergantung pada server database Anda. Petunjuk: SQL Server tidak melakukan LIMIT.
OFFSET 2
Cara termudah adalah mendapatkan nilai kedua dari hasil yang ditetapkan di aplikasi ini:
SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2
Tetapi jika Anda harus memilih nilai kedua menggunakan SQL, bagaimana dengan:
SELECT MIN(value) FROM (SELECT DISTINCT value FROM Table ORDER BY value DESC LIMIT 2) AS t
LIMIT
adalah sintaks MySql, pertanyaannya tidak menentukan versi SQL.
Anda dapat menemukan nilai kolom terbesar kedua dengan menggunakan kueri berikut
SELECT *
FROM TableName a
WHERE
2 = (SELECT count(DISTINCT(b.ColumnName))
FROM TableName b WHERE
a.ColumnName <= b.ColumnName);
Anda dapat menemukan rincian lebih lanjut tentang tautan berikut
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
MSSQL
SELECT *
FROM [Users]
order by UserId desc OFFSET 1 ROW
FETCH NEXT 1 ROW ONLY;
MySQL
SELECT *
FROM Users
order by UserId desc LIMIT 1 OFFSET 1
Tidak perlu sub kueri ... lewati satu baris dan pilih baris kedua setelah pesanan dengan menurun
SELECT MAX(Salary) FROM Employee WHERE Salary NOT IN (SELECT MAX(Salary) FROM Employee )
Permintaan ini akan mengembalikan gaji maksimum, dari hasil - yang tidak mengandung gaji maksimum dari keseluruhan tabel.
Ini adalah kode yang sangat sederhana, Anda dapat mencoba ini: -
mis: Nama tabel = tes
salary
1000
1500
1450
7500
Kode MSSQL untuk mendapatkan nilai terbesar ke-2
select salary from test order by salary desc offset 1 rows fetch next 1 rows only;
di sini 'offset 1 baris' berarti baris ke-2 tabel dan 'ambil 1 baris berikutnya saja' hanya untuk menunjukkan 1 baris. jika Anda tidak menggunakan 'ambil hanya 1 baris berikutnya' maka ini akan menampilkan semua baris dari baris kedua.
select * from (select ROW_NUMBER() over (Order by Col_x desc) as Row, Col_1
from table_1)as table_new tn inner join table_1 t1
on tn.col_1 = t1.col_1
where row = 2
Semoga bantuan ini mendapatkan nilai untuk setiap baris .....
Tom, yakin ini akan gagal ketika ada lebih dari satu nilai yang dikembalikan di select max([COLUMN_NAME]) from [TABLE_NAME]
bagian. yaitu di mana ada lebih dari 2 nilai dalam kumpulan data.
Modifikasi sedikit ke kueri Anda akan bekerja -
select max([COLUMN_NAME]) from [TABLE_NAME] where [COLUMN_NAME] **IN**
( select max([COLUMN_NAME]) from [TABLE_NAME] )
SELECT
*
FROM
table
WHERE
column < (SELECT max(columnq) FROM table)
ORDER BY
column DESC LIMIT 1
Ini adalah cara yang paling sulit:
SELECT
Column name
FROM
Table name
ORDER BY
Column name DESC
LIMIT 1,1
select age from student group by id having age<(select max(age) from student)order by age limit 1
Seperti yang Anda sebutkan nilai duplikat. Dalam hal demikian, Anda dapat menggunakan DISTINCT dan GROUP BY untuk mengetahui nilai tertinggi kedua
Ini meja
gaji
:
KELOMPOK OLEH
SELECT amount FROM salary
GROUP by amount
ORDER BY amount DESC
LIMIT 1 , 1
BERBEDA
SELECT DISTINCT amount
FROM salary
ORDER BY amount DESC
LIMIT 1 , 1
Bagian pertama LIMIT = indeks awal
Bagian kedua LIMIT = berapa nilai
select max(column_name) from table_name
where column_name not in (select max(column_name) from table_name);
not in adalah kondisi yang mengecualikan nilai tertinggi dari nama_kolom.
Referensi: wawancara programmer
Lihat Bagaimana memilih baris ke-n dalam tabel database SQL? .
Sybase SQL Anywhere mendukung:
SELECT TOP 1 START AT 2 value from table ORDER BY value
select top 1 MyIntColumn from MyTable
where
MyIntColumn <> (select top 1 MyIntColumn from MyTable order by MyIntColumn desc)
order by MyIntColumn desc