SQL Server ile son satır nasıl okunur


89

SQL Server ile son satırı okumanın en verimli yolu nedir?

Tablo, benzersiz bir anahtarda dizine eklenir - "en alttaki" anahtar değerleri son satırı temsil eder.

Yanıtlar:


181

MS SQL kullanıyorsanız şunları deneyebilirsiniz:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
Ya DB'de 5 milyon kaydınız varsa! : - \
deepdive

5
Tablo sıralama sütununda indekslenmişse, SQL sadece tablonun son satırını okuyacaktır. Pahalı sıralama veya tam tablo taraması gerekmez.
Spivonious

Son 1000 kaydı almam gerekiyorsa nasıl alacağım, söyleyebilir misiniz
Sri

1
@Sri SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCSon 1000 kaydı çalıştırırsınız ve çıkarmanız gerekir.
Rod Argumedo


18

Tablonuzda otomatik doldurulan birincil anahtar veya tarih saat sütunu (tercihen birincil anahtar) gibi benzersiz bir şekilde tanımlayıcı bir sütuna ihtiyacınız olacaktır. O zaman bunu yapabilirsiniz:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

ORDER BY columnBu sütun verilere göre sonuçlar rearange için bildirir ve DESC(böylece ilk olarak son bir koyarak) sonucu ters söyler. Bundan sonra, LIMIT 1sadece bir satır geri geçmesini söyler.


5
Vay canına, acımasızca, asıl soru özellikle SQL Server demiyordu. Yukarıdaki çözüm, SQL Server aynı konsepti tanımlamak için farklı kelimeler kullansa da tamamen yasaldır. +1
Greg Hewgill

@VinkoVrsalovic Bu, on yıl sonra bile cevabın tam tersine yararsız olduğu anlamına gelmez. Benimle aynı fikirde misiniz efendim?
snr

1
Yazılı iletişimin sorunu budur - onu amaçlanandan çok daha sert bir şekilde okumak kolaydır, özellikle de kısa olduğunda! Şimdi bunu biliyorum ve sorumluluğun yazarın üstünde olduğunu anlıyorum. Yani, bugün bunu yazacak olsaydım şöyle derdim: "Bu, soruda etiketlenen DMBS motoru olduğu için SQL Server için LIMIT yerine TOP kullanmanız gerekse de fikir budur . Bkz. Docs.microsoft.com / en-us / sql / t-sql / queries /… "@snr
Vinko Vrsalovic

11

Kimliğinizin bir kısmı sıralıysa, db'nizde bir düzen olacağını varsayıyorum

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


4

Aşağıdaki sorgunun SQL Server için herhangi bir sıralanabilir sütun olmadan maksimum performansla çalışacağını düşünüyorum.

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

Umarım anlamışsındır ... :)


Bu, DESC'i sıralayamadığınızda ve döndürülen son satıra ihtiyacınız olduğunda en iyi çözümdür.
jjthebig1

3

SQl server 2008'de sondaki sql sorgusunu kullanmayı denedim ama şu hatayı veriyor: "'last' tanınan bir yerleşik işlev adı değil."

Bu yüzden şunu kullanmayı bıraktım:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

son satırın kimliğini almak için. Bir de kullanılabilir

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)


2

Bunu dene

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
@Vinko Vrsalovic'in yukarıdaki yorumu, MSSQL'in kullanmadığını söylüyor LIMIT. Bu geri dönüşlerIncorrect syntax near LIMIT
frmbelz

1

MS SQL veritabanı 2005 için bir tablonun son satırını almak için aşağıdaki sorguyu kullanabilirsiniz:

select top 1 column_name from table_name order by column_name desc; 

Not: MS SQL veritabanı 2005 için tablonun ilk satırını almak için aşağıdaki sorguyu kullanabilirsiniz:

select top 1 column_name from table_name; 

2
select top 1tarafından sipariş vermeden ilk kaydı almanın güvenilir bir yolu değildir. Tarafından sipariş vermezseniz, SQL'in size istediği herhangi bir kaydı vermesine izin verirsiniz.
Code Magician

1

OFFSETve FETCH NEXTsonuçları görüntülerken SQL sayfalama elde etmek için SQL Server 2012'nin bir özelliğidir.

Bağımsız OFFSETdeğişken, başlangıç ​​satırının bir sonuçtan satır döndürmesine karar vermek için kullanılır ve FETCHbağımsız değişken, bir dizi satır döndürmek için kullanılır.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
En iyi cevap benzer şekilde, [Çalışan Kimliği] = TÜMÜ (Çalışanlardan MIN ([Çalışan Kimliği]) SEÇİN)
22'de manas

0

Bu, son kaydı alma ve Access DB'deki bir alanı güncelleme yöntemidir.

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


0

Sıralı bir sütununuz yoksa, her satırın fiziksel kimliğini kullanabilirsiniz:

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

0

Çoğaltılmış bir tablonuz varsa, localDatabase'de bir Identity = 1000 ve clientDatabase'de Identity = 2000 olabilir; bu nedenle, son kimliği yakalarsanız her zaman istemciden son kimliği bulabilirsiniz, mevcut bağlı veritabanından sonuncuyu değil. Dolayısıyla, en son bağlanılan veritabanını döndüren en iyi yöntem şudur:

SELECT IDENT_CURRENT('tablename')

0

Bir tablodaki "son değeri" alamıyorum, finansal araç başına Son değeri alıyorum. Aynı şey değil ama sanırım "şimdi nasıl yapıldığını" araştırmak isteyenler için önemli. Ayrıca RowNumber () ve CTE'leri kullandım ve ondan önce basitçe 1'i alıp [sütun] desc ile sırala. ancak artık ihtiyacımız yok ...

SQL server 2017 kullanıyorum, küresel olarak tüm borsalardaki tüm tıklamaları kaydediyoruz, günde ~ 12 milyar işaretimiz var, her bir Teklifi saklıyoruz, soruyor ve işlem hacimleri ve onay özellikleri dahil olmak üzere ticaret yapıyoruz (teklif, sor, ticaret ) verilen borsalardan herhangi biri.

Bu tablodaki herhangi bir sözleşme (çoğunlukla istatistik) için 253 tip tik verisine sahibiz, son işlem gören fiyat tik tipi = 4'tür, bu nedenle, kullandığımız Fiyatın "sonunu" almamız gerektiğinde:

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

Dev sistemimde oldukça verimli bir şekilde yürüttüğü uygulama planını görebilirsiniz, döviz ithal ETL'si tabloya veri pompalarken 4 saniyede yürütülür, beni yavaşlatan bir miktar kilitlenme olacaktır ... işte canlı sistemler böyle çalışır. 85.697.659 satıra karşı uygulama planı


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

Siteye hoş geldiniz. Bu bir yorum olabilir (eğer temsilciniz varsa), sorunu nasıl çözdüğünü açıklamak ve önceki 10 cevaptan ayırmak için biraz metin ekleyerek onu genişletebilir misiniz?
gung - Reinstate Monica

-5

Eminim ki:

SELECT last(column_name) FROM table

Çünkü benzer bir şey kullanıyorum:

SELECT last(id) FROM Status

7
Last (), sql-server'ın bir işlevi değildir
Taryn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.