Mysql
 sql >> Base de données >  >> RDS >> Mysql

Ordre d'entiers multi-colonnes

Le problème que vous semblez avoir est que chaque colonne a une échelle différente et que vous ne pouvez donc pas les combiner facilement. Ce problème peut être résolu en utilisant une technique appelée blanchiment. Cela implique de calculer la moyenne et l'écart type de chaque colonne (vous pouvez le faire dans 1 instruction SQL), puis de redimensionner chaque colonne à ceci lors de la sélection :

colSortPos = (colValue-colMean) / colStdev

Cela vous donnera chaque colonne allant autour de 0 dont +/- 1 écart type dans la plage +/- 1. L'astuce consiste alors à les combiner pour que des dates similaires soient ensemble. Le problème ici est qu'il ne s'agit pas d'un problème bidimensionnel et que vous devez donc penser de manière multidimensionnelle. Donc, ma suggestion est de prendre la distance euclidienne comme ordre de tri.

SELECT
    date,
    i,
    j,
    k,
    SQRT( POW(([email protected])/@iStdDEv, 2) + POW(([email protected])/@jStdDEv, 2) + POW(([email protected])/@kStdDEv, 2) )
AS
    sort_order
FROM
    table
ORDER BY
    sort_order

Le seul problème avec ceci est qu'il projette votre problème sur un espace unidimensionnel qui peut vous faire manquer certaines corrélations. Pour contourner ce problème, je suggère d'utiliser une technique de clustering comme K-means qui est assez simple à mettre en œuvre et très rapide. Cela vous permettra de regrouper vos dates en k clusters qui affichent le plus de similarité [ http:// en.wikipedia.org/wiki/K-means_clustering ]. Si vous avez les données brutes et que vous voulez jouer avec ces techniques (et d'autres), je vous suggère d'essayer la boîte à outils weka [ http://www.cs.waikato.ac.nz/ml/weka/ ] qui vous permettra de jouer avec ces techniques.