it-swarm.com.de

SQL Server SELECT LAST N Zeilen

Dies ist eine bekannte Frage, aber die beste Lösung, die ich gefunden habe, ist etwa:

SELECT TOP N *
FROM MyTable
ORDER BY Id DESC

Ich habe eine Tabelle mit vielen Zeilen. Es ist nicht möglich, diese Abfrage zu verwenden, da sie viel Zeit in Anspruch nimmt. Wie kann ich also die letzten N Zeilen auswählen, ohne ORDER BY zu verwenden?

EDIT

Sorry Duplizierte Frage von diesem

111
Diego

Sie können dies auch tun, indem Sie die ROW NUMBER BY PARTITION-Funktion verwenden. Ein tolles Beispiel finden Sie hier :

Ich verwende die Orders-Tabelle der Northwind-Datenbank ... Jetzt lassen Sie uns die letzten 5 Bestellungen abrufen, die von Mitarbeiter 5 aufgegeben wurden:

SELECT ORDERID, CUSTOMERID, OrderDate
FROM
(
    SELECT ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY OrderDate DESC) AS OrderedDate,*
    FROM Orders
) as ordlist

WHERE ordlist.EmployeeID = 5
AND ordlist.OrderedDate <= 5
33
JonVD

Sie können den SQL-Server so einrichten, dass die letzten N Zeilen mit dieser SQL ausgewählt werden:

select * from tbl_name order by id desc limit N;
75

Ich habe den Code von JonVD getestet, stellte aber fest, dass er sehr langsam war (6s).

Dieser Code dauerte 0s.

SELECT TOP(5) ORDERID, CUSTOMERID, OrderDate    
FROM Orders where EmployeeID=5    
Order By OrderDate DESC
42
ABI

Wenn Sie die letzte Anzahl von Zeilen aus einer Tabelle auswählen möchten.

Syntax wird wie sein

 select * from table_name except select top 
 (numbers of rows - how many rows you want)* from table_name

Diese Anweisungen funktionieren auf unterschiedliche Weise. Danke Jungs.

 select * from Products except select top (77-10) * from Products

auf diese Weise können Sie die letzten 10 Reihen abrufen, die Reihenfolge wird jedoch absteigend angezeigt 

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)
13

Ist "Id" indiziert? Wenn nicht, ist das eine wichtige Sache (ich vermute, dass es bereits indiziert ist).

Müssen Sie ALLE Spalten zurückgeben? Sie können eine erhebliche Geschwindigkeitsverbesserung erzielen, wenn Sie tatsächlich nur eine kleinere Teilmenge von Spalten benötigen, die vom Index in der ID-Spalte VOLLSTÄNDIG berücksichtigt werden können - z. Wenn Sie einen NONCLUSTERED-Index für die Id-Spalte haben und keine anderen Felder im Index enthalten sind, müsste der Clustered-Index nachgeschlagen werden, damit der Rest der Spalten tatsächlich zurückgegeben wird der Kosten der Abfrage. Wenn es sich um einen CLUSTERED-Index oder einen NONCLUSTERED-Index handelt, der alle anderen Felder enthält, die Sie in der Abfrage zurückgeben möchten, ist dies in Ordnung.

6
AdaTheDev

In sehr allgemeiner Weise und zur Unterstützung von SQL Server ist dies hier 

SELECT TOP(N) *
FROM tbl_name
ORDER BY tbl_id DESC

und für die Leistung ist es nicht schlecht (weniger als eine Sekunde für mehr als 10.000 Datensätze auf Server-Computer)

6
Hakam Fostok

Zuerst erhalten Sie am meisten Rekordzahlen 

 Declare @TableRowsCount Int
 select @TableRowsCount= COUNT(*) from <Your_Table>

Und dann :

In SQL Server 2012

SELECT *
FROM  <Your_Table> As L
ORDER BY L.<your Field>
OFFSET <@[email protected]> ROWS
FETCH NEXT @N ROWS ONLY;

In 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 > @[email protected] 
5
select * from (select top 6 * from vwTable order by Hours desc) T order by Hours
4
fth

Hier ist etwas, das Sie ohne order by ausprobieren können, aber ich denke, es erfordert, dass jede Zeile einzigartig ist. N ist die Anzahl der gewünschten Zeilen, L ist die Anzahl der Zeilen in der Tabelle.

select * from tbl_name except select top L-N * from tbl_name

Wie bereits erwähnt, ist die Anzahl der zurückgegebenen Zeilen nicht definiert.

EDIT: das ist eigentlich Hund langsam. Wirklich wertlos.

4
Dzamo Norton

Diese Abfrage gibt die letzten N Zeilen in der richtigen Reihenfolge zurück, aber die Leistung ist schlecht

select *
from (
    select top N *
    from TableName t
    order by t.[Id] desc
) as temp
order by temp.[Id]
2
timberhill

Das ist vielleicht nicht ganz richtig für die Frage, aber…

OFFSET-Klausel

Mit der OFFSET number -Klausel können Sie eine number von Zeilen überspringen und danach Zeilen zurückgeben. 

Dieser Doc-Link bezieht sich auf Postgres. Ich weiß nicht, ob dies für Sybase/MS SQL Server gilt.

2
Basil Bourque

Eine Technik, die ich verwende, um die MOST RECENT -Zeilen in sehr großen Tabellen abzufragen. (100+ Millionen oder 1+ Milliarden Zeilen) beschränkt die Abfrage auf das "Lesen" nur der jüngster Prozentsatz "N" von RECENT ROWS. Dies sind reale Anwendungen, zum Beispiel mache ich dies für nicht historische "Letzte Wetterdaten" oder aktuelle News-Feed-Suchen oder "Letzte GPS-Positionsdaten".

Dies ist ein enorme Leistungsverbesserung, wenn Sie sicher sind, dass sich Ihre Zeilen beispielsweise in den letzten 5% der Tabelle befinden. Selbst wenn Indizes in den Tabellen vorhanden sind, werden die Möglichkeiten auf nur 5% der Zeilen in Tabellen mit mehr als 100 Millionen oder mehr als 1 Milliarde Zeilen beschränkt. Dies ist insbesondere der Fall, wenn ältere Daten Physical Disk Reads und nicht nur Logical In Memory Reads erfordern.

Dies ist wesentlich effizienter als SELECT TOP | PROZENT | LIMIT, da die Zeilen nicht ausgewählt werden, sondern nur der Teil der zu durchsuchenden Daten.

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'
0
CodeCowboyOrg

verwenden Sie desc mit orderby am Ende der Abfrage, um die letzten Werte zu erhalten.

0
Sara
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
0
Slava