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.

Réponses:


180

Si vous utilisez MS SQL, vous pouvez essayer:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

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

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.


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)


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 ... :)


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)


2

Essaye ça

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

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; 

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

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

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 )


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

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

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


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

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

7
Last () n'est pas une fonction de sql-server
Taryn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.