Ich habe eine Tabelle, die mehrere Schlüssel in andere Tabellen enthält (wobei jeder Schlüssel aus mehreren Spalten besteht). Ich möchte in der Lage sein, Zeilen mit einem gleichen Schlüssel zu gruppieren, aber ich möchte nicht alle zusammen gruppieren . Es ist nicht einfach GROUP BY
für den Schlüssel, sondern ich möchte in der Lage sein, Gruppen von beispielsweise 10 zu bilden. Wenn also ein bestimmter Schlüssel 50 Mal auftaucht, würde ich bei dieser Gruppierung 5 Ergebnisse erhalten (5 Gruppen von 10). Ich möchte auch, dass diese Gruppierung innerhalb des Schlüssels zufällig erfolgt.
Ich wusste nicht, wie ich das direkt tun sollte, und die von mir entwickelte Kreisverkehrsmethode funktioniert nicht so, wie ich es mir vorgestellt habe. Die Kreisverkehrslösung, die ich mir ausgedacht habe, bestand darin, für jeden Schlüssel eine neue Spalte zu erstellen, die eine Ganzzahl ist, sodass der Wert i
das ith
Auftreten dieses Schlüssels darstellt (jedoch in zufälliger Reihenfolge). Ich könnte dann eine Ganzzahldivision durchführen, so dass alle n (sagen wir 10) Zeilen innerhalb des Schlüssels den gleichen Wert haben, und ich könnte einen GROUP BY
für diesen Wert ausführen.
Gibt es einen direkteren Weg, um das zu erreichen, was ich gerade beschrieben habe? Es ist ziemlich umständlich und ich hatte Probleme beim Erstellen der neuen Indexspalte (wie in dieser Frage beschrieben ).
EDIT: Beachten Sie zunächst, dass dies für MySQL ist. Ich werde ein Beispiel hinzufügen, falls mein Ziel nicht klar ist. Die MySQL-Dokumente zeigen eine Methode, um fast dorthin zu gelangen :
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;
Dadurch wird eine Tabelle erstellt, die, obwohl nicht das, was ich möchte, nahe kommt:
+--------+----+---------+
| grp | id | name |
+--------+----+---------+
| fish | 1 | lax |
| mammal | 1 | dog |
| mammal | 2 | cat |
| mammal | 3 | whale |
| bird | 1 | penguin |
| bird | 2 | ostrich |
+--------+----+---------+
Ich möchte im Wesentlichen eine GROUP BY
ID, außer ich möchte, dass die Datensätze mammal
eine "Gruppe" für die IDs 1-10, eine andere "Gruppe" für die IDs 11-20 usw. haben. Ich würde dies jedoch mit einer vorhandenen Tabelle tun. und ich würde nicht unbedingt wollen, dass "Hund" mit ID 1 auftaucht. Ich möchte, dass diese anfängliche Reihenfolge zufällig ist, aber dann von da an deterministisch.
I would want that initial ordering to be random, but then deterministic from then out.
<- sag was? Ich denke, egal was Sie tun, Sie müssen die Aufzeichnungen in eine zweite Tabelle legen. Wie genau funktioniert diese Geschäftslogik? Es gibt nichts zu verlangen, dass (zum Beispiel) der Hund an erster Stelle steht. Und was meinst du mitI would want the records from *mammal* to have one "group" for IDs 1-10, and another for IDs 11-20
... kannst du das mit einer anderen Tabelle veranschaulichen, die sich auf Säugetiere konzentriert, in der obigen Fragebeschreibung?numMammal
. Es ist mir egal, was die IDdog
bekommt, aber ich möchte nicht, dass es von der ursprünglichen Einfügereihenfolge abhängt.GROUP BY
. Ich möchte dann vielleicht Gruppen von 10 koppeln, um die Korrelation zwischen dem Durchschnitt zu finden. Ich brauche diese zufällige Reihenfolge, denn wenn die ursprüngliche Einfügereihenfolge nach Gewicht sortiert wäre, würde dies zu falschen Ergebnissen führen. Ich hoffe ich mache Sinn.Antworten:
Wie wäre es, wenn Sie ein wenig mit Ihrer ID-Spalte rechnen, um die Gruppe dynamisch zu generieren?
Dies würde Ihnen Gruppen von 10 basierend auf der ID des Datensatzes geben. Ich habe Ihre Tier-Tabelle oben verwendet, um die Daten unten zu generieren.
Beispieldaten
Ausgabe abfragen
quelle
In SQL wäre dies im Allgemeinen:
eine DISTINCT-UnterauswahlJOIN zurück zur Haupttabelle auf DISTINCT-TastenEs ist kein Aggregat, daher wird GROUP BY nicht benötigt
Bearbeiten:
Tatsächlich reicht NTILE aus, um "n Buckets pro Satz unterschiedlicher Werte" zu erstellen.
quelle
Ich sehe immer noch keine vollständigen Lösungen (die tatsächlich in MySQL funktionieren), daher ist dies die Lösung, die ich wahrscheinlich verwenden werde:
Ich hoffe immer noch, dass jemand diese Antwort schlagen kann; Ich möchte meine eigene Antwort nicht akzeptieren müssen. Ich habe das schon einmal gesagt, aber ich wusste von Anfang an, wie man # 2 macht; # 1 hat mich beunruhigt. Wenn Sie # 1 beantworten können, beantworten Sie tatsächlich auch eine andere Frage , aber es ist möglicherweise möglich, diese Frage auf eine andere Weise zu beantworten, um # 1 zu umgehen.
quelle
quelle