J'ai une table qui contient plusieurs clés dans d'autres tables (où chaque clé est composée de plusieurs colonnes). Je voudrais pouvoir regrouper des lignes qui ont une clé égale, mais je ne veux pas les regrouper toutes ensemble. Ce n'est pas simple GROUP BY
sur la clé, mais je veux plutôt pouvoir faire des groupes de disons 10. Donc, si une clé particulière apparaissait 50 fois, j'obtiendrais 5 résultats lorsque je fais ce regroupement (5 groupes de 10). Je souhaite également que ce regroupement se fasse de manière aléatoire dans la clé.
Je ne connaissais pas la façon directe de le faire, et la méthode du rond-point que j'ai trouvée ne fonctionne pas comme je le pense. La solution de rond-point que j'ai trouvée était de créer une nouvelle colonne pour chaque clé qui serait un entier tel que la valeur i
représente l' ith
occurrence de cette clé (mais dans un ordre aléatoire). Je pourrais alors faire une division entière afin que toutes les n (disons 10) lignes de la clé aient la même valeur, et je pourrais faire un GROUP BY
sur cette valeur.
Existe-t-il un moyen plus direct d'accomplir ce que je viens de décrire? C'est assez gênant et j'ai rencontré des problèmes lors de la création de la nouvelle colonne d'index (comme je l'ai décrit dans cette question ).
EDIT: Tout d'abord, notez que c'est pour MySQL. J'ajouterai un exemple au cas où mon objectif ne serait pas clair. Les documents MySQL montrent une méthode pour y arriver presque :
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;
Cela crée une table qui, bien que ce n'est pas ce que je veux, se rapproche:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
Je voudrais essentiellement GROUP BY
id, sauf que je voudrais que les enregistrements avec mammal
aient un "groupe" pour les ID 1-10, un autre "groupe" pour les ID 11-20, etc. Cependant, je le ferais avec une table existante, et je ne voudrais pas nécessairement que "dog" apparaisse avec l'ID 1. Je voudrais que cet ordre initial soit aléatoire, mais ensuite déterministe.
I would want that initial ordering to be random, but then deterministic from then out.
<- dites quoi? Je pense que peu importe ce que vous ferez, vous devrez mettre les enregistrements dans un deuxième tableau. Comment fonctionne précisément cette logique métier? En l'état, il n'y a rien à exiger (par exemple) que le chien passe en premier. Et que voulez-vous dire parI would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
... pouvez-vous illustrer cela avec un autre tableau, axé sur les mammifères, dans la description de la question ci-dessus?numMammal
. Je ne me soucie pas vraiment de ce que l'IDdog
obtient, mais je ne veux pas que cela dépende de l'ordre d'insertion d'origine.GROUP BY
. Je pourrais alors vouloir jumeler des groupes de 10 pour trouver la corrélation entre la moyenne. J'ai besoin de cet ordre aléatoire, car si l'ordre d'insertion d'origine était trié en fonction du poids, cela me donnerait de mauvais résultats. J'espère que j'ai du sens.Réponses:
Que diriez-vous de faire un petit calcul avec votre colonne ID pour générer dynamiquement le groupe?
Cela vous donnerait des groupes de 10 en fonction de l'ID de l'enregistrement. J'ai utilisé votre tableau d'animaux ci-dessus pour générer les données ci-dessous.
Exemples de données
Sortie de requête
la source
En SQL, ce serait généralement:
une sous-sélection DISTINCTREJOINDRE le tableau principal sur les touches DISTINCTCe n'est pas un agrégat donc GROUP BY n'est pas nécessaire
Éditer:
En fait, NTILE suffit à lui seul à créer "n compartiments par ensemble de valeurs distinctes"
la source
Je ne vois toujours pas de solutions complètes (qui fonctionnent réellement dans MySQL), c'est donc la solution que j'utiliserai probablement:
J'espère toujours que quelqu'un pourra battre cette réponse; Je ne veux pas avoir à accepter ma propre réponse. Je l'ai déjà dit, mais je savais depuis le début comment faire # 2; # 1 est ce qui me dérange. Si vous pouvez répondre # 1, vous répondez également à une autre question , mais il pourrait être possible de répondre à cette question d'une autre manière afin de contourner # 1.
la source
la source