Tengo una tabla que contiene varias claves en otras tablas (donde cada clave se compone de varias columnas). Me gustaría poder agrupar filas que tengan una clave igual, pero no quiero agruparlas todas . No es simple GROUP BY
en la clave, sino que quiero poder hacer grupos de digamos 10. Entonces, si una clave en particular apareciera 50 veces, obtendría 5 resultados cuando haga esta agrupación (5 grupos de 10). También quiero que esta agrupación ocurra al azar dentro de la clave.
No sabía la forma directa de hacer esto, y el método indirecto que se me ocurrió no funciona como creo que debería. La solución indirecta que se me ocurrió fue crear una nueva columna para cada clave que sería un número entero tal que el valor i
represente la ith
aparición de esa clave (pero en orden aleatorio). Entonces podría hacer una división entera para que cada n (digamos 10) filas dentro de la clave tenga el mismo valor, y podría hacer un GROUP BY
sobre ese valor.
¿Hay alguna forma más directa de lograr lo que acabo de describir? Es bastante incómodo, y tuve problemas para crear la nueva columna de índice (como describí en esta pregunta ).
EDITAR: en primer lugar, tenga en cuenta que esto es para MySQL. Agregaré un ejemplo en caso de que mi objetivo no esté claro. Los documentos de MySQL muestran un método para llegar casi allí :
CREATE TABLE animals (
grp ENUM('fish','mammal','bird') NOT NULL,
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR(30) NOT NULL,
PRIMARY KEY (grp,id)
) ENGINE=MyISAM;
INSERT INTO animals (grp,name) VALUES
('mammal','dog'),('mammal','cat'),
('bird','penguin'),('fish','lax'),('mammal','whale'),
('bird','ostrich');
SELECT * FROM animals ORDER BY grp,id;
Esto crea una tabla que, aunque no es lo que quiero, se acerca:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
Me esencialmente igual a GROUP BY
la identificación, excepto que me gustaría los registros con mammal
que tienen un "grupo" para los ID de 1-10, otro "grupo" para los ID 11-20, etc. Sin embargo, estaría haciendo esto con una tabla existente, y no necesariamente quiero que aparezca "perro" con ID 1. Quisiera que ese pedido inicial sea aleatorio, pero luego determinista a partir de ese momento.
I would want that initial ordering to be random, but then deterministic from then out.
<- decir qué? Creo que no importa lo que hagas, tendrás que poner los registros en una segunda tabla de algún tipo. ¿Con qué precisión funciona esta lógica de negocios? Como es, no hay nada que requiera (por ejemplo) que el perro sea lo primero. ¿Y qué quieres decir conI would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
... puedes ilustrar eso con otra tabla, centrada en los mamíferos, en la descripción de la pregunta anterior?numMammal
. Realmente no me importa qué identificadordog
obtenga, pero no quiero que dependa del orden de inserción original.GROUP BY
. Entonces podría querer emparejar grupos de 10 para encontrar la correlación entre el promedio. Necesito este orden aleatorio porque si el orden de inserción original se clasificara por peso, entonces me daría los resultados incorrectos. Espero tener sentido.Respuestas:
¿Qué tal hacer un poco de matemática contra su columna de ID para generar dinámicamente el grupo?
Esto le daría grupos de 10 según la ID del registro. Usé la tabla de animales de arriba para generar los datos a continuación.
Data de muestra
Consulta de salida
fuente
En SQL generalmente esto sería:
una subselección DISTINCTÚNETE de nuevo a la tabla principal con las teclas DISTINCTNo es un agregado, por lo que GROUP BY no es necesario
Editar:
En realidad, NTILE es suficiente por sí solo para crear "n cubos por conjunto de valores distintos"
fuente
Todavía no veo ninguna solución completa (que realmente funcione en MySQL), por lo que esta es la solución que probablemente usaré:
Todavía espero que alguien pueda superar esta respuesta; No quiero tener que aceptar mi propia respuesta. He dicho esto antes, pero sabía desde el principio cómo hacer el # 2; # 1 es lo que me ha estado preocupando. Si puede responder el n. ° 1, entonces también contestará otra pregunta , pero podría ser posible responder esta pregunta de alguna otra manera para evitar el n. ° 1.
fuente
fuente