it-swarm.com.de

Wie wähle ich die letzten 5 Zeilen in einer Tabelle aus, ohne zu sortieren?

Ich möchte die letzten 5 Datensätze aus einer Tabelle in SQL Server auswählen, ohne die Tabelle in aufsteigender oder absteigender Reihenfolge anzuordnen.

23
ganesh Verma

Dies ist so ziemlich die bizarrste Abfrage, die ich je geschrieben habe, aber ich bin mir ziemlich sicher, dass sie die letzten 5 Zeilen einer Tabelle erhält, ohne zu bestellen:

select * 
from issues
where issueid not in (
    select top (
        (select count(*) from issues) - 5
    ) issueid
    from issues
)

Beachten Sie, dass dadurch die Möglichkeit von SQL Server 2005 zum Übergeben eines Werts in die Klausel "top" genutzt wird. Dies funktioniert nicht unter SQL Server 2000.

34
Matt Hamilton

Angenommen, Sie haben einen Index für die ID. Dies wird blitzschnell sein:

SELECT * FROM [MyTable] WHERE [id] > (SELECT MAX([id]) - 5 FROM [MyTable])
27
msuvajac
  1. Sie müssen die Anzahl der Zeilen in der Tabelle zählen (sagen wir, wir haben 12 Zeilen)
  2. dann 5 Reihen von ihnen abziehen (wir sind jetzt in 7)
  3. wählen Sie * wobei index_column> 7 

    select * from users
    where user_id > 
    ( (select COUNT(*) from users) - 5)
    

    sie können sie ASC oder DESC bestellen

    Aber wenn Sie diesen Code verwenden

    select TOP 5 from users order by user_id DESC
    

    es wird nicht leicht bestellt.

10
M.M.F

Die Art und Weise, in der Ihre Frage formuliert ist, lässt den Eindruck entstehen, als müssten Sie die Daten physisch in der Tabelle sortieren, um sie in der gewünschten Reihenfolge wiederzugeben. Ist dies nicht der Fall, existiert zu diesem Zweck die ORDER BY-Klausel. Die physikalische Reihenfolge, in der die Datensätze gespeichert werden, bleibt bei Verwendung von ORDER BY unverändert. Die Datensätze werden im Speicher (oder im temporären Speicherplatz) sortiert, bevor sie zurückgegeben werden.

Beachten Sie, dass die Reihenfolge der zurückgegebenen Datensätze nicht ohne die Verwendung einer ORDER BY-Klausel garantiert wird. Obwohl einige der Vorschläge hier funktionieren können, gibt es keinen Grund zu der Annahme, dass sie weiter funktionieren werden, noch können Sie nachweisen, dass sie in allen Fällen mit Ihrer aktuellen Datenbank funktionieren. Dies ist von Entwurf - ich gehe davon aus, dass es der Datenbank-Engine die Freiheit gibt, wie sie es mit den Datensätzen tun wird, um die beste Leistung in dem Fall zu erzielen, in dem keine explizite Reihenfolge angegeben ist.

Angenommen, Sie wollten die letzten 5 Datensätze in aufsteigender Reihenfolge nach dem Feld Name sortiert haben, könnten Sie Folgendes tun, was in SQL 2000 oder 2005 funktionieren sollte:

select Name 
from (
    select top 5 Name 
    from MyTable 
    order by Name desc
) a 
order by Name asc
10
RedFilter

Suche 5 Datensätze der letzten Datensätze, die du verwenden kannst,

SELECT *
FROM   Table Name
WHERE  ID <= IDENT_CURRENT('Table Name')
AND ID >= IDENT_CURRENT('Table Name') - 5
4
Nadia Deqmin

Ohne Bestellung ist dies unmöglich. Was definiert den "Boden"? Im Folgenden werden 5 Zeilen entsprechend ihrer Speicherung in der Datenbank ausgewählt.

SELECT TOP 5 * FROM [TableName]

3
Stefan Mai

Nun, die "letzten fünf Zeilen" sind abhängig vom Clustered-Index tatsächlich die letzten fünf Zeilen. Ihr gruppierter Index ist definitionsgemäß die Reihenfolge, in der die Zeilen angeordnet sind. So können Sie die "letzten fünf Reihen" wirklich nicht ohne Reihenfolge erhalten. Sie können jedoch die letzten fünf Zeilen abrufen, die sich auf den gruppierten Index beziehen.

SELECT TOP 5 * FROM MyTable
ORDER BY MyCLusteredIndexColumn1, MyCLusteredIndexColumnq, ..., MyCLusteredIndexColumnN DESC
3
Charles Graham
select * from table limit 5 offset (select count(*) from table) - 5;
2
Rob

In SQL Server 2012 können Sie Folgendes tun:

Declare @Count1 int ;

Select @Count1 = Count(*)
FROM    [Log] AS L

SELECT  
   *
FROM    [Log] AS L
ORDER BY L.id
OFFSET @Count - 5 ROWS
FETCH NEXT 5 ROWS ONLY;
2

Letzte 5 Zeilen in MySQL abrufen


Diese Abfrage funktioniert einwandfrei

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC

oder

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc
2
M Palani Mca

Wenn Sie wissen, wie viele Zeilen insgesamt vorhanden sind, können Sie die ROW_NUMBER () - Funktion verwenden. Dies ist ein Beispiel von MSDN ( http://msdn.Microsoft.com/en-us/library/ms186734.aspx) )

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;
2
idstam

Versuchen Sie Folgendes, wenn Sie keinen Primärschlüssel oder keine identische Spalte haben:

select [Stu_Id],[Student_Name] ,[City] ,[Registered], 
       RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from student
ORDER BY RowNum desc 
2
Apps Tawale

Sie können sie aus dem Speicher abrufen.
Sie erhalten also zuerst die Zeilen in einem DataSet und dann die letzten 5 aus dem DataSet.

1
eddy147

Es gibt einen praktischen Trick, der in einigen Datenbanken zum Sortieren in der Datenbankreihenfolge funktioniert. 

SELECT * FROM TableName ORDER BY true

Offensichtlich kann dies in Verbindung mit allen anderen hier veröffentlichten Vorschlägen funktionieren, um die Ergebnisse in der Reihenfolge "Reihenfolge, in der sie aus der Datenbank kamen" zu belassen. In einigen Datenbanken ist dies die Reihenfolge, in der sie zuletzt geändert wurden. 

1
Kent Fredric

Wenn die Anzahl der Zeilen in der Tabelle weniger als 5 beträgt, lautet die Antwort von Matt Hamilton und msuvajac falsch ..__, da ein TOP N-Rowcount-Wert möglicherweise nicht negativ ist.
Ein gutes Beispiel ist zu finden - Hier .

1
Ali Sohrabi
select * 
from table 
order by empno(primary key) desc 
fetch first 5 rows only
1

ich benutze diesen Code:

select * from tweets where placeID = '$placeID' and id > (
    (select count(*) from tweets where placeID = '$placeID')-2)
1
user3236289
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

Danke an @Apps Tawale , basierend auf seiner Antwort , hier ein bisschen von einer anderen (meiner) Version, 

So wählen Sie die letzten 5 Datensätze ohne Identitätsspalte aus 

select top 5 *, 
   RowNum = row_number() OVER (ORDER BY (SELECT 0))    
from  [dbo].[ViewEmployeeMaster]
ORDER BY RowNum desc

Trotzdem hat es eine Bestellung von, aber auf RowNum :)

Note (1): Die obige Abfrage wird die Reihenfolge umkehren, die wir erhalten, wenn wir die Hauptauswahlabfrage ausführen.

Um die Reihenfolge aufrechtzuerhalten, können wir wie folgt vorgehen:

select *, RowNum2 = row_number() OVER (ORDER BY (SELECT 0))    
from ( 
        select top 5 *, RowNum = row_number() OVER (ORDER BY (SELECT 0))    
        from  [dbo].[ViewEmployeeMaster]
        ORDER BY RowNum desc
     ) as t1
order by RowNum2 desc

Note (2): Ohne Identitätsspalte benötigt die Abfrage bei großen Daten etwas Zeit

0
Irf

In SQL Server scheint dies nicht möglich zu sein, ohne die Bestellung in der Abfrage zu verwenden. Das habe ich benutzt.

SELECT *
FROM
(
    SELECT TOP 5 *
    FROM [MyTable]
    ORDER BY Id DESC /*Primary Key*/
) AS T
ORDER BY T.Id ASC; /*Primary Key*/
0
Rahul Mahadik