Ini adalah pertanyaan yang diketahui tetapi solusi terbaik yang saya temukan adalah seperti:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
Saya punya meja dengan banyak baris. Ini bukan kemungkinan untuk menggunakan kueri itu karena itu membutuhkan banyak waktu. Jadi bagaimana saya bisa memilih N baris terakhir tanpa menggunakan ORDER BY?
EDIT
Maaf pertanyaan digandakan yang satu ini
id
diindeks maka itu hanya akan memindai indeks itu secara terbalik dan berhenti setelah 5 baris pertama. Jika tidak diindeks maka perlu dilakukanTOP N
penyortiran. Ini tidak akan lebih buruk daripada cara lain untuk melakukannya. Itu tidak menyortir seluruh tabel (meskipun itu perlu memindai seluruh tabel)Jawaban:
Anda juga dapat melakukannya dengan menggunakan Fitur ROW NUMBER BY PARTITION. Contoh yang bagus dapat ditemukan di sini :
sumber
Anda dapat membuat SQL server untuk memilih baris N terakhir menggunakan SQL ini:
select * from tbl_name order by id desc limit N;
sumber
Saya menguji kode JonVD, tetapi ternyata sangat lambat, 6s.
Kode ini membutuhkan 0 detik.
SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate FROM Orders where EmployeeID=5 Order By OrderDate DESC
sumber
OrderDate
diindeks, itu pada dasarnya harus sama cepatnya untuk memilih baris N pertama atau terakhir dari sebuah kueri. Saya menyadari ada kemungkinanOrderDate
berkorelasi dengan baik untuk pesanan yang dimasukkan, tapi itu efek samping yang terbaik, dan masih memerlukan pemindaian tabel, bukan? (Dan saya tidak berpikir itu menjawab apa yang OP menunjuk sebagaiJika Anda ingin memilih jumlah baris terakhir dari tabel.
Sintaksnya akan seperti
select * from table_name except select top (numbers of rows - how many rows you want)* from table_name
Pernyataan ini bekerja tetapi dengan cara yang berbeda. Terima kasih kawan.
select * from Products except select top (77-10) * from Products
dengan cara ini Anda bisa mendapatkan 10 baris terakhir tetapi urutan akan menunjukkan cara yang jelas
select top 10 * from products order by productId desc
select * from products where productid in (select top 10 productID from products) order by productID desc
select * from products where productID not in (select top((select COUNT(*) from products ) -10 )productID from products)
sumber
Dengan cara yang sangat umum dan untuk mendukung SQL server di sini adalah
SELECT TOP(N) * FROM tbl_name ORDER BY tbl_id DESC
dan untuk kinerjanya, tidak buruk (kurang dari satu detik untuk lebih dari 10.000 catatan di mesin Server)
sumber
Apakah "Id" diindeks? Jika tidak, itu penting untuk dilakukan (saya curiga sudah diindeks).
Juga, apakah Anda perlu mengembalikan SEMUA kolom? Anda mungkin bisa mendapatkan peningkatan kecepatan yang substansial jika Anda hanya benar-benar membutuhkan subset kolom yang lebih kecil yang dapat SEPENUHNYA dipenuhi oleh indeks pada kolom ID - misalnya jika Anda memiliki indeks NONCLUSTERED pada kolom Id, tanpa yang lain bidang yang disertakan dalam indeks, maka itu harus melakukan pencarian pada indeks berkerumun untuk benar-benar mendapatkan sisa kolom untuk dikembalikan dan itu bisa membuat banyak biaya kueri. Jika itu adalah indeks TERKELUP, atau indeks NONCLUSTERED yang menyertakan semua bidang lain yang ingin Anda kembalikan dalam kueri, Anda akan baik-baik saja.
sumber
Pertama, Anda paling banyak mendapatkan jumlah rekor
Declare @TableRowsCount Int select @TableRowsCount= COUNT(*) from <Your_Table>
Lalu :
Di SQL Server 2012
SELECT * FROM <Your_Table> As L ORDER BY L.<your Field> OFFSET <@TableRowsCount-@N> ROWS FETCH NEXT @N ROWS ONLY;
Di SQL Server 2008
SELECT * FROM ( SELECT ROW_NUMBER() OVER(ORDER BY ID) AS sequencenumber, * FROM <Your_Table> Order By <your Field> ) AS TempTable WHERE sequencenumber > @TableRowsCount-@N
sumber
Inilah sesuatu yang dapat Anda coba tanpa
order by
tetapi saya pikir itu mengharuskan setiap baris unik.N
adalah jumlah baris yang Anda inginkan,L
adalah jumlah baris dalam tabel.select * from tbl_name except select top L-N * from tbl_name
Seperti disebutkan sebelumnya, baris mana yang dikembalikan tidak ditentukan.
EDIT: ini sebenarnya anjing lambat. Tidak ada nilainya.
sumber
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
sumber
Kueri ini mengembalikan baris N terakhir dalam urutan yang benar, tetapi kinerjanya buruk
select * from ( select top N * from TableName t order by t.[Id] desc ) as temp order by temp.[Id]
sumber
gunakan desc dengan orderby di akhir kueri untuk mendapatkan nilai terakhir.
sumber
MS tidak mendukung LIMIT di t-sql. Seringkali saya hanya mendapatkan MAX (ID) dan kemudian mengurangi.
select * from ORDERS where ID >(select MAX(ID)-10 from ORDERS)
Ini akan mengembalikan kurang dari 10 catatan jika ID tidak berurutan.
sumber
Ini mungkin tidak sesuai dengan pertanyaan, tapi…
Klausa OFFSET
The
OFFSET number
klausul memungkinkan Anda untuk melewatkan lebih dari satu nomor baris dan kemudian kembali baris setelah itu.Tautan dokumen itu ke Postgres; Saya tidak tahu apakah ini berlaku untuk Sybase / MS SQL Server.
sumber
DECLARE @MYVAR NVARCHAR(100) DECLARE @step int SET @step = 0; DECLARE MYTESTCURSOR CURSOR DYNAMIC FOR SELECT col FROM [dbo].[table] OPEN MYTESTCURSOR FETCH LAST FROM MYTESTCURSOR INTO @MYVAR print @MYVAR; WHILE @step < 10 BEGIN FETCH PRIOR FROM MYTESTCURSOR INTO @MYVAR print @MYVAR; SET @step = @step + 1; END CLOSE MYTESTCURSOR DEALLOCATE MYTESTCURSOR
sumber
Sebuah teknik yang saya gunakan untuk menanyakan baris TERBARU dalam tabel yang sangat besar (100+ juta atau 1+ miliar baris) membatasi kueri untuk "membaca" hanya persentase "N" terbaru dari BARIS TERBARU. Ini adalah aplikasi dunia nyata, misalnya saya melakukan ini untuk Data Cuaca Terkini non-historis, atau pencarian umpan Berita terkini atau data titik data lokasi GPS terkini.
Ini adalah peningkatan kinerja yang sangat besar jika Anda mengetahui dengan pasti bahwa baris Anda berada di TOP 5% tabel terbaru misalnya. Bahkan jika ada indeks pada Tabel, lebih jauh membatasi kemungkinan hanya 5% dari baris dalam tabel yang memiliki 100+ juta atau 1+ miliar baris. Hal ini terutama terjadi ketika Data Lama akan membutuhkan pembacaan Disk Fisik dan tidak hanya Logical In Memory Pembacaan .
Ini jauh lebih efisien daripada SELECT TOP | PERCENT | LIMIT karena tidak memilih baris, tetapi hanya membatasi porsi data yang akan dicari.
DECLARE @RowIdTableA BIGINT DECLARE @RowIdTableB BIGINT DECLARE @TopPercent FLOAT -- Given that there is an Sequential Identity Column -- Limit query to only rows in the most recent TOP 5% of rows SET @TopPercent = .05 SELECT @RowIdTableA = (MAX(TableAId) - (MAX(TableAId) * @TopPercent)) FROM TableA SELECT @RowIdTableB = (MAX(TableBId) - (MAX(TableBId) * @TopPercent)) FROM TableB SELECT * FROM TableA a INNER JOIN TableB b ON a.KeyId = b.KeyId WHERE a.Id > @RowIdTableA AND b.Id > @RowIdTableB AND a.SomeOtherCriteria = 'Whatever'
sumber
Untuk menampilkan 3 baris terakhir tanpa menggunakan
order by
:select * from Lms_Books_Details where Book_Code not in (select top((select COUNT(*) from Lms_Books_Details ) -3 ) book_code from Lms_Books_Details)
sumber
Coba gunakan
EXCEPT
sintaks.Sesuatu seperti ini:
SELECT * FROM clientDetails EXCEPT (SELECT TOP (numbers of rows - how many rows you want) * FROM clientDetails)
sumber
Mungkin agak terlambat, tetapi berikut ini adalah pilihan sederhana yang menjawab pertanyaan Anda.
SELECT * FROM "TABLE" T ORDER BY "T.ID_TABLE" DESC LIMIT 5;
sumber