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?
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. –