sql >> Base de Datos >  >> RDS >> Mysql

Ordenación de enteros de varias columnas

El problema que parece tener es que cada columna tiene una escala diferente y, por lo tanto, no puede combinarlas fácilmente. Este problema se puede solucionar mediante una técnica llamada blanqueamiento. Esto implica calcular el promedio y la desviación estándar de cada columna (podría hacerlo en 1 instrucción SQL) y luego volver a escalar cada columna a esto al seleccionar:

colSortPos = (colValue-colMean) / colStdev

Hacer esto le dará a cada columna un rango de alrededor de 0 con +/- 1 desviación estándar dentro del rango +/- 1. El truco entonces es combinarlos para que las fechas similares estén juntas. El problema aquí es que este no es un problema de 2 dimensiones, por lo que debe pensar de manera multidimensional. Así que mi sugerencia es tomar la distancia euclidiana como orden de clasificación.

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

El único problema con esto es que proyecta su problema en un espacio unidimensional que puede hacer que pierda algunas correlaciones. Para evitar esto, sugiero usar una técnica de agrupación como K-means, que es bastante simple de implementar y es realmente rápida. Esto le permitirá agrupar sus fechas en k grupos que muestren la mayor similitud [ http:// en.wikipedia.org/wiki/K-means_clustering ]. Si tiene los datos sin procesar y quiere jugar con estas (y otras) técnicas, le sugiero que pruebe el kit de herramientas weka [ http://www.cs.waikato.ac.nz/ml/weka/ ] que te permitirá jugar con estas técnicas.