Je veux obtenir 1000 enregistrements d'une table au hasard, donc je l'utilise:Problème d'utilisation ROW_NUMBER() pour obtenir des enregistrements au hasard (SQL Server 2005)
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
Cependant, je ne veux pas voir dans rn
mon résultat, donc je fais:
SELECT mycol1
, mycol2
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
Lorsque je fais cela, les résultats ne viennent plus au hasard. Ils viennent comme si je viens de dire top 10000 sans randomisation en utilisant row_number().
Lorsque je change la requête à
SELECT mycol1
, mycol2
, rn
FROM (
SELECT top 1000
mycol1
, mycol2
, ROW_NUMBER() OVER (ORDER BY NEWID()) rn
FROM mytable
) a
ils sont à nouveau au hasard.
Je suppose que le serveur SQL fait une sorte d'optimisation, en disant "hé, ce gars n'a pas besoin de la colonne rn
de toute façon, alors ignorez-le". Mais cela entraîne un comportement inattendu dans ce cas. y-a-t-il un moyen d'éviter ça? PS: j'utilise l'astuce ROW_NUMBER() car mytable a 10 mio. lignes et
SELECT top 10000 *
FROM mytable
ORDER BY NEWID()
s'exécute pour toujours, alors qu'avec ROW_NUMBER() cela ne prend que jusqu'à 30 secondes.
A aimé votre "ROW_NUMBER() OVER (ORDER BY NEWID())". Avoir utilisé cela pour un grand effet à quelques reprises. –