2010-06-20 5 views
4

Je dois sélectionner des lignes d'échantillons d'un ensemble. Par exemple, si ma requête select renvoie x lignes alors si x est supérieur à 50, je veux seulement 50 lignes retournées, mais pas seulement les 50 premières mais 50 qui sont réparties uniformément sur le jeu de résultats. La table dans ce cas enregistre des itinéraires - emplacements GPS + DateTime. Je commande sur DateTime et j'ai besoin d'un échantillon raisonnable des valeurs Latitude Longitude &. Merci d'avance [SQL Server 2008]SQL sélectionner un échantillon de lignes

+0

Quel SGBD utilisez-vous? –

+0

SQL Server 2008 – Pierce

Répondre

1

Je vous suggère d'ajouter une colonne calculée à votre sélection sur ResultSet obtenu un nombre aléatoire, puis sélectionnez les 50 premiers triés par cette colonne. Cela vous donnera un échantillon aléatoire.

Par exemple:

SELECT TOP 50 *, RAND(Id) AS Random 
FROM SourceData 
ORDER BY Random 

où SourceData est votre table de données source ou vue. Cela suppose que T-SQL sur SQL Server 2008, en passant. Il suppose également que vous avez une colonne Id avec des identifiants uniques sur votre source de données. Si vos ids sont très faibles chiffres, il est une bonne pratique de les multiplier par un grand nombre entier avant de les transmettre à RAND, comme ceci:

RAND(Id * 10000000) 
3

Pour obtenir des lignes échantillon dans SQL Server, utilisez cette requête:

SELECT TOP 50 * FROM Table 
ORDER BY NEWID(); 

Si vous souhaitez obtenir chaque n-ième ligne (10, dans cet exemple), essayez cette requête:

SELECT * From 
(
    SELECT *, (Dense_Rank() OVER (ORDER BY Column ASC)) AS Rank 
    FROM Table 
) AS Ranking 
WHERE Rank % 10 = 0; 

Source

Plus exemples de requêtes sélection de lignes aléatoires pour d'autres SGBDR populaires peuvent être trouvés ici: http://www.petefreitag.com/item/466.cfm

+0

Je pense que c'est MS SQL Server –

3

Chaque ligne n'th pour obtenir 50:

SELECT * 
FROM table 
WHERE row_number() over() MOD (SELECT Count(*) FROM table)/50 == 0 
FETCH FIRST 50 ROWS ONLY 

Et si vous voulez un échantillon aléatoire, aller avec la réponse de jimmy_keen.

MISE À JOUR: En ce qui concerne l'exigence de fonctionner sur MS SQL, je pense qu'il devrait être changé à ce (pas MS SQL Server autour de tester si):

SELECT TOP 50 * 
    FROM (
    SELECT t.*, row_number() over() AS rn, (SELECT count(*) FROM table)/50 AS step 
    FROM table t 
    ) 
    WHERE rn % step == 0 
+0

Wow Merci inflagranti c'est le business. Merci aux autres aussi. – Pierce

+0

Ce code ne s'exécute pas sur SQL Server 2008. – CesarGon

+0

Il doit être standard SQL. @Pierce: N'aviez-vous pas juste l'étiquette SQL au début? –

0

Si vous voulez un échantillon statiquement correct, l'échantillon de table est une mauvaise solution. Une bonne solution comme je l'ai décrit dans here basé sur un document de recherche Microsoft, est de créer une vue matérialisée sur votre table qui comprend une colonne supplémentaire comme CAST (ROW_NUMBER() OVER (...) AS BYTE) comme RAND_COL_, alors vous peut ajouter un index sur cette colonne, plus d'autres colonnes intéressantes et obtenir des échantillons statistiquement corrects pour vos requêtes assez rapidement. (en utilisant WHERE RAND_COL_ = 1).

Questions connexes