J'utilise toujours cette requête dans le serveur SQL pour obtenir le numéro de ligne dans une table:
SELECT *
FROM (SELECT *,
Row_number()
OVER(
ORDER BY [myidentitycolumn]) RowID
FROM mytable) sub
WHERE rowid = 15
Maintenant, je travaille dans Access 2010 et cela semble ne pas fonctionner. Existe-t-il un remplacement pour cette requête dans Access?
MS-Access ne prend pas en charge ROW_NUMBER (). Utilisez TOP 1:
SELECT TOP 1 *
FROM [MyTable]
ORDER BY [MyIdentityCOlumn]
Si vous avez besoin de la 15ème rangée, MS-Access n’a pas de moyen simple et intégré de procéder. Vous pouvez simuler le numéro d'avant en utilisant l'ordre inverse imbriqué pour obtenir ceci:
SELECT TOP 1 *
FROM (
SELECT TOP 15 *
FROM [MyTable]
ORDER BY [MyIdentityColumn] ) t
ORDER BY [MyIdentityColumn] DESC
Une autre façon d'attribuer un numéro de ligne dans une requête consiste à utiliser la fonction DCount
.
SELECT *, DCount("[ID]","[mytable]","[ID]<=" & [ID]) AS row_id
FROM [mytable]
WHERE row_id=15
J'avais besoin des meilleurs résultats x de points par équipe.
Le classement ne résout pas ce problème quand il y a des résultats avec le même nombre de points . Il me faut donc une recordnumber
J'ai créé une fonction VBA dans Access pour créer une recordnumber
qui réinitialise le changement d'identifiant.
Vous devez interroger cette requête avec où recordnumber <= x
pour obtenir les points par équipe.
NB Access modifie le numéro d'enregistrement
Ce n'est pas ce que je pensais que cela arriverait.
Ce problème a été résolu en utilisant une table temporaire et en enregistrant les clés recordnumbers
et __ ou un champ supplémentaire dans la table.
SELECT ID, Points, RecordNumberOffId([ID}) AS Recordnumber
FROM Team ORDER BY ID ASC, Points DESC;
Il utilise 3 variables de niveau module pour se rappeler entre les appels
Dim PreviousID As Long
Dim PreviousRecordNumber As Long
Dim TimeLastID As Date
Public Function RecordNumberOffID(ID As Long) As Long
'ID is sortgroup identity
'Reset if last call longer dan nn seconds in the past
If Time() - TimeLastID > 0.0003 Then '0,000277778 = 1 second
PreviousID = 0
PreviousRecordNumber = 0
End If
If ID <> PreviousID Then
PreviousRecordNumber = 0
PreviousID = ID
End If
PreviousRecordNumber = PreviousRecordNumber + 1
RecordNumberOffID = PreviousRecordNumber
TimeLastID = Time()
End Function