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.
numMammal
. Realmente no me importa qué identificador dog
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.
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?