Comment lire la dernière ligne avec SQL Server

88

Quelle est la manière la plus efficace de lire la dernière ligne avec SQL Server?

La table est indexée sur une clé unique - les valeurs de clé «du bas» représentent la dernière ligne.

rp.
la source

Réponses:

180

Si vous utilisez MS SQL, vous pouvez essayer:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 
EggyBach
la source
17
Et si vous aviez 5 millions d'enregistrements dans DB! : - \
deepdive
4
Si la table est indexée sur la colonne de tri, SQL lira simplement la dernière ligne de la table. Aucun tri coûteux ou analyse complète de la table n'est nécessaire.
Spivonious
Si j'ai besoin d'obtenir les 1000 derniers enregistrements, comment puis-je les obtenir, pouvez-vous le dire
Sri
1
@Sri Vous exécuteriez SELECT TOP 1000 * FROM table_name ORDER BY column_name DESCet devriez sortir les 1000 derniers enregistrements.
Rod Argumedo
22
select whatever,columns,you,want from mytable
 where mykey=(select max(mykey) from mytable);
Adam Pierce
la source
qu'est-ce que mykey? dans mon cas?
Mowgli
@Mowgli mykeyest votre index de table
Cliff Burton
2
Si mykeyc'est un identifiant unique, cette approche n'aiderait pas
Iman Mahmoudinasab
18

Vous aurez besoin d'une sorte de colonne d'identification unique dans votre table, comme une clé primaire à remplissage automatique ou une colonne datetime (de préférence la clé primaire). Ensuite, vous pouvez faire ceci:

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

Le lui ORDER BY columndit de réorganiser les résultats en fonction des données de cette colonne, et le lui DESCdit d'inverser les résultats (mettant ainsi le dernier en premier). Après cela, le lui LIMIT 1dit de ne repasser qu'une seule ligne.

Willurd
la source
6
MSSQL n'utilise pas LIMIT
Vinko Vrsalovic
4
Wow, dur, la question originale ne disait même pas spécifiquement SQL Server. La solution ci-dessus est parfaitement légitime même si SQL Server utilise des mots différents pour décrire le même concept. +1
Greg Hewgill
11

Si certains de vos identifiants sont en ordre, je suppose qu'il y aura un certain ordre dans votre base de données

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

lionelmessi
la source
4

Je pense que la requête ci-dessous fonctionnera pour SQL Server avec des performances maximales sans aucune colonne triable

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

J'espère que vous l'avez compris ... :)

ConsiderItDone
la source
C'est la meilleure solution lorsque vous ne pouvez pas trier DESC et que vous avez juste besoin de la dernière ligne telle qu'elle est renvoyée.
jjthebig1
3

J'ai essayé d'utiliser la dernière requête SQL dans le serveur SQl 2008 mais cela donne cette erreur: "'last' n'est pas un nom de fonction intégré reconnu."

J'ai donc fini par utiliser:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

pour obtenir l'ID de la dernière ligne. On pourrait également utiliser

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
la source
3

Vous pouvez utiliser last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

Je le teste sur l'une de mes bases de données et cela a fonctionné comme prévu.

Vous pouvez également consulter la documentation ici: https://msdn.microsoft.com/en-us/library/hh231517.aspx

Gil Gomes
la source
2

Essaye ça

SELECT id from comission_fees ORDER BY id DESC LIMIT 1
Ashish Pathak
la source
1
Comme un commentaire ci-dessus par @Vinko Vrsalovic dit que MSSQL n'utilise pas LIMIT. This Incorrect syntax near LIMIT
Returns
1

Afin de récupérer la dernière ligne d'une table pour la base de données MS SQL 2005, vous pouvez utiliser la requête suivante:

select top 1 column_name from table_name order by column_name desc; 

Remarque: pour obtenir la première ligne de la table pour la base de données MS SQL 2005, vous pouvez utiliser la requête suivante:

select top 1 column_name from table_name; 
Neolisk
la source
2
select top 1sans commande par n'est pas un moyen fiable d'obtenir le premier enregistrement. Si vous ne mettez pas dans un ordre par, vous autorisez SQL à vous donner tout enregistrement qui lui plaît.
Code Magician
1

OFFSETet FETCH NEXTsont une fonctionnalité de SQL Server 2012 pour réaliser la pagination SQL tout en affichant les résultats.

L' OFFSETargument est utilisé pour décider de la ligne de départ pour renvoyer les lignes d'un résultat et l' FETCHargument est utilisé pour renvoyer un ensemble de nombre de lignes.

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY
Jignesh Bhayani
la source
0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)
manas
la source
1
La meilleure réponse de la même manière, nous pouvons obtenir la première ligne SELECT * des employés où [ID employé] = TOUT (SELECT MIN ([ID employé]) des employés)
manas
0

C'est ainsi que vous obtenez le dernier enregistrement et mettez à jour un champ dans Access DB.

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

Muhammad Sajid
la source
0

Si vous n'avez aucune colonne ordonnée, vous pouvez utiliser l'ID physique de chaque ligne:

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
la source
0

Si vous avez une table répliquée, vous pouvez avoir une identité = 1000 dans localDatabase et une identité = 2000 dans clientDatabase, donc si vous attrapez le dernier ID, vous pouvez toujours trouver le dernier du client, pas le dernier de la base de données connectée actuelle. Donc, la meilleure méthode qui renvoie la dernière base de données connectée est:

SELECT IDENT_CURRENT('tablename')
utilisateur3096335
la source
0

Eh bien, je n'obtiens pas la «dernière valeur» dans un tableau, j'obtiens la dernière valeur par instrument financier. Ce n'est pas la même chose, mais je suppose que c'est pertinent pour certains qui cherchent à savoir "comment c'est fait maintenant". J'ai également utilisé RowNumber () et CTE et avant cela pour simplement prendre 1 et ordonner par [colonne] desc. mais nous n'avons plus besoin de ...

J'utilise SQL Server 2017, nous enregistrons tous les ticks sur tous les échanges dans le monde, nous avons ~ 12 milliards de ticks par jour, nous stockons chaque Bid, ask et trade, y compris les volumes et les attributs d'un tick (bid, ask, trade ) de l'un des échanges donnés.

Nous avons 253 types de données de ticks pour un contrat donné (principalement des statistiques) dans ce tableau, le dernier prix négocié est le type de tick = 4 donc, lorsque nous devons obtenir le "dernier" prix que nous utilisons:

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

Vous pouvez voir le plan d'exécution sur mon système de développement, il s'exécute assez efficacement, s'exécute en 4 secondes pendant que l'importation d'échange ETL pompe des données dans la table, il y aura un verrouillage qui me ralentira ... c'est juste comme ça que les systèmes en direct fonctionnent. plan d'exécution contre 85.697.659 lignes

Walter Vehoeven
la source
-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)
Hamza Abuzahra
la source
Bienvenue sur le site. Cela pourrait être un commentaire (si vous aviez le représentant), cela vous dérangerait-il de le développer en ajoutant du texte pour expliquer comment il résout le problème et pour le différencier des 10 réponses précédentes?
gung - Réintégrer Monica le
-5

Je suis presque sûr que c'est:

SELECT last(column_name) FROM table

Parce que j'utilise quelque chose de similaire:

SELECT last(id) FROM Status
Maniakk
la source
7
Last () n'est pas une fonction de sql-server
Taryn