2010-11-09 4 views
1

Disons que j'ai une table avec des colonnes A, B, C, D, E, etc. où chaque colonne est un int. Cette table contient des centaines de lignes avec des valeurs aléatoires dans chaque colonne. Quelle est la manière optimale de renvoyer la valeur correspondant au 25ème centile pour chaque colonne?percentile 25 pour plusieurs colonnes

Par exemple:

A B C D E 
1 5 8 9 3 
3 6 5 0 2 
8 3 6 1 8 
4 1 8 3 1 
7 2 2 6 9 

Ici colonne A se compose des valeurs 1, 3, 4, 8 et 7. Le 25 e centile pour cet ensemble devrait être . La colonne B est composée des valeurs 1, 2, 3, 5 et 6. Le 25ème centile de cet ensemble doit être . C est , D est et E est . Comme il y a 5 rangées, le 25e centile est simplement la deuxième plus petite valeur. S'il y avait 40 lignes ce serait la 10ème plus petite valeur. Comment puis-je écrire efficacement une requête qui retourne:

A B C D E 
3 2 5 1 2 

Ce que j'ai essayé:

WITH 
    ATable as (
     SELECT A, CAST(NTILE(100) OVER (ORDER BY A) as int) as Percentile 
     FROM MyTable 
    ), 
    BTable as (
     SELECT B, CAST(NTILE(100) OVER (ORDER BY B) as int) as Percentile 
     FROM MyTable 
    ), 
    ... 
SELECT 
    (SELECT TOP 1 A FROM ATable where Percentile = 25) as A, 
    (SELECT TOP 1 B FROM BTable where Percentile = 25) as B, 
    ... 

J'ai environ 40 de ces colonnes et mon expérience avec mon jeu de données et NTILE est avec autant de colonnes, la performance devient un problème sérieux. Quelqu'un a-t-il une meilleure idée?

Répondre

2

Votre solution est correcte. Je ne vois pas de solution plus folle.

Vous avez besoin d'une ligne différente par colonne, vous devez donc interroger chaque colonne séparément. Si vous avez 40 colonnes, c'est 40 CTE réunies. Simple.

Normalement, vous attendez une ligne entière ou un groupe ou des lignes ou un sous-ensemble de colonnes pour les lignes qui répondent à certains critères: ne pas attendre que chaque colonne soit interrogée séparément pour obtenir des valeurs non liées aux autres valeurs du même rangée.

+0

Merci pour votre réponse. C'est bon de savoir quand je devrais arrêter de regarder. J'exposerai cette question pendant quelques jours avant d'accepter une réponse, mais la vôtre ira si rien ne se passe mieux. D'un côté, j'admets que cette question est étrange dans l'abstrait. Concrètement, j'essaie de le faire avec les données des joueurs de la NBA (basketball). Donc, imaginez que chaque colonne est une statistique individuelle comme les points, les passes, les blocs, etc. Je dois déterminer, d'un seul coup, toutes les statistiques au 25e centile. Ces statistiques du 25ème percentile représentent les statistiques pour un "sous-générique" dans une simulation de basket-ball fantastique sur laquelle je travaille. –

0

Je ne sais pas si l'article suivant est toujours d'actualité pour les versions actuelles de MS SQL Server, mais vous pouvez le vérifier

A Better NTILE

+0

merci pour cela. Je vais essayer et voir si cela fonctionne. Si l'amélioration promise de 40x porte ses fruits, ce sera fantastique. –

+0

Si cela porte des fruits, tenez-nous au courant – Unreason

Questions connexes