gunakan offset untuk tujuan ini ... pilih ekstensi dari [dbo]. [Karyawan] pesan dengan ekstensi, hapus, offset, 2 baris, ambil hanya 1 baris berikutnya
Jinto John
Jawaban:
294
SELECT MAX( col )FROMtableWHERE col <(SELECT MAX( col )FROMtable)
Jawaban Matt dan Vinoy juga menangani duplikat. Misalkan nilai terbesar diulang maka menggunakan jawaban Matt akan menghasilkan nilai terbesar kedua yang benar sementara jika Anda menggunakan pendekatan 2 desc dan min teratas , Anda mungkin mendapatkan nilai terbesar sebagai gantinya.
Pankaj Sharma
Bagaimana jika ada beberapa tertinggi kedua ... Maka ini tidak akan memberikan semua Tuples
Parth Satra
2
terima kasih, gunakan ini untuk mencari kencan terakhir kedua di sini
shaijut
Jauh lebih baik daripada pendekatan saya menggunakan ORDER_BY dan LIMIT untuk pernyataan bagian dalam
andig
Catatan ini tidak akan mengembalikan hasil jika tidak ada catatan sebelum yang diminta.
andig
61
SELECT MAX(col)FROMtableWHERE col NOTIN(SELECT MAX(col)FROMtable);
--filter out the maxselect max( col )from[table]where col <(select max( col )from[table])--sort top two then bottom oneselecttop1 col from(selecttop2 col from[table]orderby col) topTwoorderby 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 maxdigunakan agregasi.
Atau, di Microsoft SQL 2005 dan di atas Anda dapat menggunakan ROW_NUMBER()fungsi:
select colfrom(select ROW_NUMBER()over(orderby col asc)as'rowNum', colfrom[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(SELECTTOP2[column]FROM[Table]GROUPBY[column]ORDERBY[column]DESC) a
Inilah yang saya harapkan untuk dilihat. Jawaban yang diterima ternyata jelek jika Anda membutuhkannya n. Yang ini tahan uji itu.
Robin Maben
@RobinMaben Robin, bagaimana dengan skenario ketika nilai terbesar diulang? Misalkan kolom berisi angka 1 hingga 100 tetapi 100 diulang dua kali. Maka solusi ini akan menghasilkan nilai terbesar kedua sebagai 100, yang akan salah. Baik?
Pankaj Sharma
1
@PankajSharma tidak, ini masih akan bekerja, karena klausa GROUP BY
Joel Coehoorn
Ini adalah cara standar untuk melakukan ini. Jawaban yang diterima harus diperbarui untuk yang satu ini.
Guilherme Melo
1
Saya mendapatkan kesalahan yang mengatakan saya tidak bisa menggunakan TOPdan OFFSETdalam permintaan yang sama.
Ini adalah kode yang sangat sederhana, Anda dapat mencoba ini: -
mis: Nama tabel = tes
salary
1000150014507500
Kode MSSQL untuk mendapatkan nilai terbesar ke-2
select salary from test orderby salary desc offset 1rowsfetch next 1rows 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.
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.
Jawaban:
sumber
sumber
Dalam T-Sql ada dua cara:
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:sumber
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):
MySQL:
Memperbarui:
SQL Server 2012 sekarang mendukung sintaks OFFSET / FETCH yang jauh lebih bersih (dan standar ):
sumber
n
. Yang ini tahan uji itu.TOP
danOFFSET
dalam permintaan yang sama.Saya kira Anda dapat melakukan sesuatu seperti:
atau
tergantung pada server database Anda. Petunjuk: SQL Server tidak melakukan LIMIT.
sumber
OFFSET 2
Cara termudah adalah mendapatkan nilai kedua dari hasil yang ditetapkan di aplikasi ini:
Tetapi jika Anda harus memilih nilai kedua menggunakan SQL, bagaimana dengan:
sumber
LIMIT
adalah sintaks MySql, pertanyaannya tidak menentukan versi SQL.Anda dapat menemukan nilai kolom terbesar kedua dengan menggunakan kueri berikut
Anda dapat menemukan rincian lebih lanjut tentang tautan berikut
http://www.abhishekbpatel.com/2012/12/how-to-get-nth-maximum-and-minimun.html
sumber
Permintaan yang sangat sederhana untuk menemukan nilai terbesar kedua
sumber
MSSQL
MySQL
Tidak perlu sub kueri ... lewati satu baris dan pilih baris kedua setelah pesanan dengan menurun
sumber
Permintaan ini akan mengembalikan gaji maksimum, dari hasil - yang tidak mengandung gaji maksimum dari keseluruhan tabel.
sumber
Pertanyaan lama yang saya tahu, tetapi ini memberi saya rencana eksekutif yang lebih baik:
sumber
Ini adalah kode yang sangat sederhana, Anda dapat mencoba ini: -
mis: Nama tabel = tes
Kode MSSQL untuk mendapatkan nilai terbesar ke-2
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.
sumber
Semoga bantuan ini mendapatkan nilai untuk setiap baris .....
sumber
Yang paling sederhana
sumber
Catatan
sal is col nama
emp adalah nama tabel
sumber
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 -
sumber
subquery mengembalikan semua nilai selain yang terbesar. pilih nilai maksimal dari daftar yang dikembalikan.
sumber
sumber
sumber
Ini adalah cara yang paling sulit:
sumber
sumber
Seperti yang Anda sebutkan nilai duplikat. Dalam hal demikian, Anda dapat menggunakan DISTINCT dan GROUP BY untuk mengetahui nilai tertinggi kedua
Ini meja
:
Bagian pertama LIMIT = indeks awal
Bagian kedua LIMIT = berapa nilai
sumber
ini akan mengembalikan sal tabel emp tertinggi ketiga
sumber
not in adalah kondisi yang mengecualikan nilai tertinggi dari nama_kolom.
Referensi: wawancara programmer
sumber
Sesuatu seperti ini? Saya belum mengujinya:
sumber
Lihat Bagaimana memilih baris ke-n dalam tabel database SQL? .
Sybase SQL Anywhere mendukung:
sumber
Menggunakan kueri yang berkorelasi:
sumber
Permintaan ini memilih maksimum tiga gaji. Jika dua emp mendapatkan gaji yang sama ini tidak mempengaruhi permintaan.
sumber
sumber
Ini bekerja di MS SQL:
sumber