Lesen der letzten Zeile mit SQL Server

86

Was ist der effizienteste Weg, um die letzte Zeile mit SQL Server zu lesen?

Die Tabelle ist auf einem eindeutigen Schlüssel indiziert - die "unteren" Schlüsselwerte repräsentieren die letzte Zeile.

rp.
quelle

Antworten:

178

Wenn Sie MS SQL verwenden, können Sie Folgendes versuchen:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
EggyBach
quelle
17
Was ist, wenn Sie 5 Millionen Datensätze in der DB haben? : - \
Deepdive
4
Wenn die Tabelle in der Sortierspalte indiziert ist, liest SQL nur die letzte Zeile der Tabelle. Es ist keine teure Sortierung oder ein vollständiger Tabellenscan erforderlich.
Spivonious
Wenn ich die letzten 1000 Datensätze bekommen muss, wie bekomme ich sie
?
1
@Sri Sie würden ausführen SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCund sollten die letzten 1000 Datensätze ausgeben.
Rod Argumedo
22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
Adam Pierce
quelle
Was ist Mykey? in meinem Fall?
Mowgli
@ Mowgli mykeyist Ihr Tabellenindex
Cliff Burton
2
Wenn mykeyes sich um eine eindeutige Kennung handelt, würde dieser Ansatz nicht helfen
Iman Mahmoudinasab,
18

Sie benötigen eine Art eindeutig identifizierende Spalte in Ihrer Tabelle, z. B. einen automatisch ausfüllenden Primärschlüssel oder eine Datums- / Uhrzeitspalte (vorzugsweise den Primärschlüssel). Dann können Sie dies tun:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

Das ORDER BY columnweist es an, die Ergebnisse gemäß den Daten dieser Spalte neu anzuordnen, und das DESCweist es an, die Ergebnisse umzukehren (wobei das letzte zuerst gesetzt wird). Danach weist das LIMIT 1an, nur eine Zeile zurückzugeben.

Willurd
quelle
6
MSSQL verwendet LIMIT nicht
Vinko Vrsalovic
4
Wow, hart, die ursprüngliche Frage sagte nicht einmal speziell SQL Server. Die obige Lösung ist absolut legitim, obwohl SQL Server unterschiedliche Wörter verwendet, um dasselbe Konzept zu beschreiben. +1
Greg Hewgill
11

Wenn einige Ihrer IDs in Ordnung sind, gehe ich davon aus, dass Ihre Datenbank in Ordnung sein wird

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

Lionelmessi
quelle
4

Ich denke, dass die folgende Abfrage für SQL Server mit maximaler Leistung ohne sortierbare Spalte funktioniert

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

Hoffe du hast es verstanden ... :)

Betrachten Sie es als erledigt
quelle
Dies ist die beste Lösung, wenn Sie DESC nicht sortieren können und nur die letzte Zeile benötigen, wenn sie zurückgegeben wird.
jjthebig1
3

Ich habe versucht, die letzte in SQL-Abfrage in SQL Server 2008 zu verwenden, aber es gibt diesen Fehler: "'last' ist kein anerkannter integrierter Funktionsname."

Also habe ich Folgendes verwendet:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

um die ID der letzten Zeile zu erhalten. Man könnte es auch gebrauchen

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
quelle
3

Sie können last_value verwenden: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Ich teste es in einer meiner Datenbanken und es hat wie erwartet funktioniert.

Sie können die Dokumentation auch hier überprüfen: https://msdn.microsoft.com/en-us/library/hh231517.aspx

Gil Gomes
quelle
2

Versuche dies

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
Ashish Pathak
quelle
1
Als Kommentar oben von @Vinko sagt Vrsalovic, dass MSSQL nicht verwendet LIMIT. Dies kehrt zurückIncorrect syntax near LIMIT
frmbelz
1

Um die letzte Zeile einer Tabelle für die MS SQL-Datenbank 2005 abzurufen, können Sie die folgende Abfrage verwenden:

select top 1 column_name from table_name order by column_name desc; 

Hinweis: Um die erste Zeile der Tabelle für die MS SQL-Datenbank 2005 abzurufen, können Sie die folgende Abfrage verwenden:

select top 1 column_name from table_name; 
Neolisk
quelle
2
select top 1ohne eine Bestellung von ist kein zuverlässiger Weg, um die erste Aufzeichnung zu erhalten. Wenn Sie keine Bestellung aufgeben, erteilen Sie SQL die Erlaubnis, Ihnen alle gewünschten Datensätze zu geben.
Code Magier
1

OFFSETund FETCH NEXTsind eine Funktion von SQL Server 2012, um SQL-Paging beim Anzeigen von Ergebnissen zu erreichen.

Das OFFSETArgument wird verwendet, um die Startzeile für die Rückgabe von Zeilen aus einem Ergebnis zu bestimmen, und das FETCHArgument wird verwendet, um eine Reihe von Zeilen zurückzugeben.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY
Jignesh Bhayani
quelle
0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
Manas
quelle
1
Die beste Antwort in ähnlicher Weise können wir die erste Zeile SELECT * von Mitarbeitern erhalten, wobei [Mitarbeiter-ID] = ALL (SELECT MIN ([Mitarbeiter-ID]) von Mitarbeitern)
Manas
0

Auf diese Weise erhalten Sie den letzten Datensatz und aktualisieren ein Feld in Access DB.

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

Muhammad Sajid
quelle
0

Wenn Sie keine geordnete Spalte haben, können Sie die physische ID jeder Zeile verwenden:

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
quelle
0

Wenn Sie eine replizierte Tabelle haben, können Sie in localDatabase eine Identität = 1000 und in der clientDatabase eine Identität = 2000 haben. Wenn Sie also die letzte ID abrufen, finden Sie möglicherweise immer die letzte vom Client, nicht die letzte aus der aktuell verbundenen Datenbank. Die beste Methode, die die zuletzt verbundene Datenbank zurückgibt, ist:

SELECT IDENT_CURRENT('tablename')
user3096335
quelle
0

Nun, ich bekomme nicht den "letzten Wert" in einer Tabelle, sondern den letzten Wert pro Finanzinstrument. Es ist nicht dasselbe, aber ich denke, es ist relevant für einige, die nachsehen möchten, "wie es jetzt gemacht wird". Ich habe auch RowNumber () und CTEs verwendet und davor einfach 1 genommen und nach [column] desc bestellt. aber wir müssen nicht mehr ...

Ich verwende SQL Server 2017, wir zeichnen alle Ticks an allen Börsen weltweit auf, wir haben ~ 12 Milliarden Ticks pro Tag, wir speichern jedes Gebot, jede Nachfrage und jeden Handel, einschließlich der Volumina und Attribute eines Ticks (Bid, Ask, Trade) ) eines der angegebenen Börsen.

Wir haben 253 Arten von Tick-Daten für einen bestimmten Kontrakt (meistens Statistiken) in dieser Tabelle. Der zuletzt gehandelte Preis ist Tick-Typ = 4. Wenn wir also den "letzten" Preis erhalten müssen, den wir verwenden:

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

Sie können den Ausführungsplan auf meinem Entwicklungssystem sehen, der sehr effizient ausgeführt wird. Er wird in 4 Sekunden ausgeführt, während die Exchange-Import-ETL Daten in die Tabelle pumpt. Es wird einige Sperren geben, die mich verlangsamen. Genau so funktionieren Live-Systeme. Ausführungsplan gegen 85.697.659 Zeilen

Walter Vehoeven
quelle
-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Hamza Abuzahra
quelle
Willkommen auf der Website. Dies könnte ein Kommentar sein (wenn Sie den Repräsentanten hätten). Würde es Ihnen etwas ausmachen, ihn zu erweitern, indem Sie Text hinzufügen, um zu erklären, wie er das Problem löst und um ihn von den 10 vorhergehenden Antworten zu unterscheiden?
Gung - Reinstate Monica
-5

Ich bin mir ziemlich sicher, dass es so ist:

SELECT last(column_name) FROM table

Weil ich etwas Ähnliches benutze:

SELECT last(id) FROM Status
Maniakk
quelle
7
Last () ist keine Funktion von SQL-Server
Taryn