2010-09-06 5 views
0

J'ai une table dans SQL Server 2005 qui ressemble àSélection des 5 premières lignes uniques, triées de manière aléatoire dans SQL Server 2005?

1 | bob | joined 
2 | bob | left 
3 | john | joined 
4 | steve | joined 
5 | andy | joined 
6 | kyle | joined 

Ce que je veux est de donner à quelqu'un la possibilité de tirer vers le haut l'activité de 5 utilisateurs au hasard (montrant leur dernière activité)

ex: Je veux retourner les résultats 1, 3, 4, 5, 6 - ou - 2, 3, 4, 5, 6 - mais jamais - 1, 2, 3, 4, 5 (parce que 1 et 2 sont des activités du même utilisateur , et je ne veux pas qu'il apparaisse deux fois au détriment d'un utilisateur unique différent qui pourrait voir son activité affichée)

J'essaie quelque chose comme SELECT TOP(5) FROM table ORDER BY NEWID() pour obtenir le top 5 et l'aspect aléatoire va, mais lorsque je tente d'intégrer UNIQUE ou DISTINCT partout (pour arrêter de recevoir en retour les lignes 1 et 2) i obtenir des erreurs SQL et je ne sais pas comment progresser

+0

Nous pourrions être d'une aide beaucoup plus grande si nous savions quel est votre SQL jusqu'à présent et quelles erreurs le système rejette ... – Frankie

Répondre

1
select top 5 name, id from (
    select top 99.999 PERCENT name,id, NEWID() dummy from sysobjects 
    order by dummy) dummyName 

Cela fonctionne il suffit de remplacer les noms de colonnes et de tables pour ceux que vous voulez

1

l'utilisation d'un CTE:

WITH cte AS (
    SELECT t.id, 
      t.name, 
      t.txt, 
      ROW_NUMBER() OVER(PARTITION BY t.name 
           ORDER BY NEWID()) AS rank 
    FROM TABLE t) 
    SELECT TOP 5 
     c.id, 
     c.name, 
     c.txt 
    FROM cte c 
    WHERE c.rank = 1 
ORDER BY NEWID() 

équivalent non-CTE:

SELECT TOP 5 
     c.id, 
     c.name, 
     c.txt 
    FROM (SELECT t.id, 
       t.name, 
       t.txt, 
       ROW_NUMBER() OVER(PARTITION BY t.name 
             ORDER BY NEWID()) AS rank 
      FROM TABLE t) c 
    WHERE c.rank = 1 
ORDER BY NEWID() 
Questions connexes