Cara membaca baris terakhir dengan SQL Server

89

Apa cara paling efisien untuk membaca baris terakhir dengan SQL Server?

Tabel diindeks dengan kunci unik - nilai kunci "bawah" mewakili baris terakhir.

rp.
sumber

Jawaban:

181

Jika Anda menggunakan MS SQL, Anda dapat mencoba:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
EggyBach
sumber
17
Bagaimana jika Anda memiliki 5 juta rekaman di DB! : - \
deepdive
5
Jika tabel diindeks pada kolom sortir, maka SQL hanya akan membaca baris terakhir dari tabel. Tidak diperlukan sortir yang mahal atau pemindaian tabel lengkap.
Spivonious
Jika saya perlu mendapatkan 1000 rekaman terakhir bagaimana saya mendapatkannya, dapatkah Anda memberi tahu
Sri
1
@Sri Anda akan mengeksekusi SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCdan harus mengeluarkan 1000 record terakhir.
Rod Argumedo
22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
Adam Pierce
sumber
apa mykey? dalam hal ini?
Mowgli
@Mowgli mykeyadalah indeks tabel Anda
Cliff Burton
2
Jika mykeypengenal unik, pendekatan ini tidak akan membantu
Iman Mahmoudinasab
18

Anda akan memerlukan semacam kolom pengidentifikasi unik di tabel Anda, seperti kunci utama yang mengisi otomatis atau kolom waktu (sebaiknya kunci utama). Kemudian Anda bisa melakukan ini:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

The ORDER BY columnmemberitahu itu untuk menyusun ulang hasil menurut data kolom itu, dan DESCmemberitahu itu untuk membalikkan hasil (sehingga menempatkan yang terakhir terlebih dahulu). Setelah itu, perintah LIMIT 1untuk hanya mundur satu baris.

willurd
sumber
5
Wow, kasar, pertanyaan awal bahkan tidak menyebutkan SQL Server secara spesifik. Solusi di atas sangat sah meskipun SQL Server menggunakan kata yang berbeda untuk menggambarkan konsep yang sama. +1
Greg Hewgill
@VinkoVrsalovic bukan berarti jawabannya tidak berguna, bahkan setelah satu dekade. Apakah Anda setuju dengan saya, Pak?
snr
1
Inilah masalah komunikasi tertulis - mudah untuk membacanya dengan lebih kasar daripada yang dimaksudkan, terutama bila itu singkat! Saya sekarang tahu itu dan saya mengerti tanggung jawab ada pada penulis. Jadi, jika saya menulisnya hari ini, saya akan berkata: "Itulah idenya, meskipun Anda harus menggunakan TOP daripada LIMIT untuk SQL Server, karena itulah mesin DMBS yang diberi tag dalam pertanyaan tersebut. Lihat docs.microsoft.com / en-us / sql / t-sql / queries /… "@snr
Vinko Vrsalovic
11

Jika beberapa id Anda sudah beres, saya berasumsi akan ada beberapa order di db Anda

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

Lionel Messi
sumber
4

Saya pikir kueri di bawah ini akan berfungsi untuk SQL Server dengan kinerja maksimum tanpa kolom yang dapat diurutkan

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

Harap Anda mengerti ... :)

Anggap saja sudah beres
sumber
Ini adalah solusi terbaik saat Anda tidak dapat mengurutkan DESC dan Anda hanya perlu baris terakhir saat dikembalikan.
jjthebig1
3

Saya mencoba menggunakan kueri sql terakhir di SQl server 2008 tetapi memberikan kesalahan ini: "'terakhir' bukan nama fungsi bawaan yang dikenali."

Jadi saya akhirnya menggunakan:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

untuk mendapatkan Id baris terakhir. Bisa juga digunakan

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)
Neha Verma
sumber
3

Anda dapat menggunakan nilai_akhir: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Saya mengujinya di salah satu database saya dan berfungsi seperti yang diharapkan.

Anda juga dapat memeriksa dokumentasi de di sini: https://msdn.microsoft.com/en-us/library/hh231517.aspx

Gil Gomes
sumber
2

Coba ini

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
Ashish pathak
sumber
1
Seperti komentar di atas oleh @Vinko Vrsalovic mengatakan MSSQL tidak digunakan LIMIT. Ini mengembalikanIncorrect syntax near LIMIT
frmbelz
1

Untuk mendapatkan kembali baris terakhir dari tabel untuk database MS SQL 2005, Anda dapat menggunakan kueri berikut ini:

select top 1 column_name from table_name order by column_name desc; 

Catatan: Untuk mendapatkan baris pertama tabel untuk database MS SQL 2005, Anda dapat menggunakan kueri berikut ini:

select top 1 column_name from table_name; 
Neolisk
sumber
2
select top 1Tanpa order by bukanlah cara yang dapat diandalkan untuk mendapatkan rekor pertama. Jika Anda tidak memesan dengan, Anda memberi izin kepada SQL untuk memberi Anda catatan apa pun yang diinginkan.
Code Magician
1

OFFSET dan FETCH NEXT merupakan fitur SQL Server 2012 untuk mencapai paging SQL saat menampilkan hasil.

Itu OFFSET argumen digunakan untuk menentukan baris mulai baris kembali dari hasil dan FETCHargumen yang digunakan untuk mengembalikan satu set jumlah baris.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY
Jignesh Bhayani
sumber
0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
manas
sumber
1
Jawaban terbaik juga kita bisa mendapatkan baris pertama SELECT * dari Employees dimana [Employee ID] = ALL (SELECT MIN ([Employee ID]) from Employees)
manas
0

Ini adalah cara Anda mendapatkan rekaman terakhir dan memperbarui bidang di Access DB.

MEMPERBARUI compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )

Muhammad Sajid
sumber
0

Jika Anda tidak memiliki kolom berurutan, Anda dapat menggunakan id fisik setiap baris:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC
Sylvain Rodrigue
sumber
0

Jika Anda memiliki tabel direplikasi, Anda dapat memiliki Identity = 1000 di localDatabase dan Identity = 2000 di clientDatabase, jadi jika Anda menangkap ID terakhir Anda mungkin selalu menemukan yang terakhir dari klien, bukan yang terakhir dari database yang terhubung saat ini. Jadi metode terbaik yang mengembalikan database terhubung terakhir adalah:

SELECT IDENT_CURRENT('tablename')
pengguna3096335
sumber
0

Saya tidak mendapatkan "nilai terakhir" dalam tabel, saya mendapatkan nilai terakhir per instrumen keuangan. Ini tidak sama tapi saya rasa ini relevan untuk beberapa orang yang mencari untuk mencari "bagaimana hal itu dilakukan sekarang". Saya juga menggunakan RowNumber () dan CTE dan sebelumnya hanya mengambil 1 dan memesan berdasarkan [kolom] desc. namun kita tidak perlu lagi ...

Saya menggunakan SQL server 2017, kami mencatat semua tick di semua bursa secara global, kami memiliki ~ 12 miliar tick sehari, kami menyimpan setiap Bid, ask, dan trade termasuk volume dan atribut tick (bid, ask, trade ) dari salah satu bursa yang diberikan.

Kami memiliki 253 jenis data tick untuk kontrak tertentu (kebanyakan statistik) di tabel itu, harga terakhir yang diperdagangkan adalah jenis tick = 4 jadi, ketika kita perlu mendapatkan "terakhir" dari Harga yang kita gunakan:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

Anda dapat melihat rencana eksekusi pada sistem dev saya yang dijalankan dengan cukup efisien, dijalankan dalam 4 detik sementara ETL impor pertukaran memompa data ke dalam tabel, akan ada beberapa penguncian yang memperlambat saya ... begitulah cara kerja sistem langsung. rencana eksekusi terhadap 85.697.659 baris

Walter Vehoeven
sumber
-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Hamza Abuzahra
sumber
Selamat datang di situs. Ini bisa berupa komentar (jika Anda memiliki perwakilan), maukah Anda mengembangkannya dengan menambahkan beberapa teks untuk menjelaskan cara menyelesaikan masalah & untuk membedakannya dari 10 jawaban sebelumnya?
gung - Kembalikan Monica
-5

Saya cukup yakin bahwa ini:

SELECT last(column_name) FROM table

Karena saya menggunakan yang serupa:

SELECT last(id) FROM Status
maniakk
sumber
7
Last () bukan fungsi dari sql-server
Taryn