Mysql
 sql >> Database >  >> RDS >> Mysql

Ordinamento di interi a più colonne

Il problema che sembra che tu abbia è che ogni colonna ha una scala diversa e quindi non puoi combinarle facilmente. Questo problema può essere risolto utilizzando una tecnica chiamata sbiancamento. Ciò comporta il calcolo della deviazione media e standard di ciascuna colonna (puoi farlo in 1 istruzione SQL) e quindi il ridimensionamento di ciascuna colonna a questo quando si seleziona:

colSortPos = (colValue-colMean) / colStdev

In questo modo otterrai ogni colonna compresa tra 0 e +/- 1 deviazione standard all'interno dell'intervallo +/- 1. Il trucco quindi è combinarli in modo che date simili siano insieme. Il problema qui è che questo non è un problema bidimensionale e quindi è necessario pensare in modo multidimensionale. Quindi il mio suggerimento è di prendere la distanza euclidea come ordinamento.

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

L'unico problema con questo è che proietta il tuo problema su uno spazio unidimensionale che potrebbe farti perdere alcune correlazioni. Per aggirare questo problema, suggerisco di utilizzare una tecnica di clustering come K-means che è piuttosto semplice da implementare ed è davvero veloce. Ciò ti consentirà di raggruppare le tue date in k cluster che mostrano la maggiore somiglianza [ http:// en.wikipedia.org/wiki/K-means_clustering ]. Se hai i dati grezzi e vuoi giocare con queste (e altre) tecniche, ti suggerisco di provare il toolkit weka [ http://www.cs.waikato.ac.nz/ml/weka/ ] che ti permetterà di giocare con queste tecniche.