Ordnen Sie den Arbeitsort nach dem Zufallsprinzip zu, und jeder Standort sollte die Anzahl der designierten Mitarbeiter nicht überschreiten

8

Ich versuche, einzigartige zufällige Entsendung Orte der Mitarbeiter innerhalb einer Liste von Orten zu wählen, alle Mitarbeiter sind bereits an diesen Orten veröffentlicht, ich versuche, einen neuen zufälligen Buchungsplatz für sie mit "wo" Bedingung zu generieren "Angestellter neuer zufälliger Standort wird nicht mit ihrem Heimatort übereinstimmen und zufällig ausgewählte Mitarbeiter mit ihrer Bezeichnung müssen kleiner oder gleich sein. Platz weise Benennungsnummern aus der Tabelle" Orte ""

Die Employee-Tabelle lautet:

%Vor%

Und so weiter ...

Und die Places-Tabelle (PlaceNames mit der Anzahl der Mitarbeiter - Bezeichnung) lautet: -

%Vor%

und so weiter ...

versucht mit newid () wie unten und um Mitarbeiter mit RandomPosting Ortsnamen auswählen zu können,

%Vor%

zusätzlich muss ich die zufällige Auswahl basierend auf Bezeichnungsnummern (in der Tabelle Orte) begrenzen ... das heißt, jedem Mitarbeiter einen PlaceName (von Places) nach dem Zufallsprinzip zuzuweisen, der nicht CurrentPosting und Home (in Employee) und Place entspricht weise Bezeichnung wird als gegebene Zahlen nicht überschreiten.

Vielen Dank im Voraus.

    
Gaurav 22.09.2012, 13:09
quelle

2 Antworten

1

Vielleicht in etwa so:

%Vor%

Das sollte versuchen, Mitarbeiter zufällig auf der Grundlage ihrer Bezeichnung abzugleichen, dieselbe currentPosting und home zu verwerfen und nicht mehr zuzuordnen, als in jeder Spalte für die Bezeichnung angegeben ist. Dies könnte jedoch den gleichen Mitarbeiter für mehrere Stellen zurückgeben, da sie basierend auf diesen Kriterien mehr als eins zuordnen können.

BEARBEITEN: Nachdem Sie Ihren Kommentar gelesen haben, dass Sie keine leistungsstarke Einzelabfrage benötigen, um dieses Problem zu lösen (was ich nicht sicher bin, ist sogar möglich), und da es eher ein "einmaliger" Prozess zu sein scheint, der Sie sein werden Ich habe den folgenden Code mit einem Cursor und einer temporären Tabelle geschrieben, um das Problem der Aufgaben zu lösen:

%Vor%

Der Grundgedanke ist, dass die Mitarbeiter in zufälliger Reihenfolge durchlaufen werden und jedem einen zufälligen Ort zugewiesen wird, der die Kriterien für verschiedene Heim- und aktuelle Buchungen erfüllt und den Betrag steuert, der jedem Ort zugewiesen wird für jede Bezeichnung, um sicherzustellen, dass die Standorte nicht für jede Rolle "überzuordnet" sind.

Dieses Snippet ändert Ihre Daten jedoch nicht . Die letzte SELECT -Anweisung gibt nur die vorgeschlagenen Zuordnungen zurück. Sie können dies jedoch sehr leicht ändern, um die Änderungen an Ihrer Tabelle Employee entsprechend vorzunehmen.

    
Pablo Romeo 22.09.2012, 15:30
quelle
1

Ich gehe davon aus, dass die Einschränkungen sind:

  • Ein Mitarbeiter kann nicht an denselben Ort gehen, an dem er gerade ist.
  • Alle Standorte müssen mindestens einen Mitarbeiter in jeder Kategorie haben, in dem ein Mitarbeiter erwartet wird.

Die wichtigste Idee ist, zu erkennen, dass Sie keine "zufällige" Aufgabe suchen. Sie suchen nach einer Permutation von Positionen unter der Bedingung, dass sich jeder anderswo bewegt.

Ich werde eine Antwort für Manager beschreiben. Sie werden wahrscheinlich drei Abfragen für jede Art von Mitarbeiter wünschen.

Die Schlüsselidee ist eine ManagerPositions-Tabelle. Dies hat einen Platz, eine fortlaufende Nummer und eine fortlaufende Nummer innerhalb des Ortes. Das Folgende ist ein Beispiel:

%Vor%

Die Abfrage erstellt diese Tabelle, indem sie sich mit einer Funktion row_number () einer Spalte zu INFORMATION_SCHEMA.columns anfügt, um eine Sequenz zuzuweisen. Dies ist ein schneller und schmutziger Weg, um eine Sequenz in SQL Server zu erhalten - aber vollkommen gültig, solange die maximale Anzahl, die Sie benötigen (dh die maximale Anzahl von Managern an einem bestimmten Ort), geringer ist als die Anzahl der Spalten in Datenbank. Es gibt andere Methoden, um den allgemeineren Fall zu behandeln.

Die nächste Schlüsselidee besteht darin, die Orte zu drehen, anstatt sie zufällig auszuwählen. Dies verwendet Ideen aus der Modulo-Arithmetik - addiere einen Offset und nehme den Rest über die Gesamtzahl der Positionen. Die letzte Abfrage sieht folgendermaßen aus:

%Vor%

Okay, mir ist klar, dass das kompliziert ist. Sie haben eine Tabelle für jede Managerposition (keine Zählung wie in Ihrer Anweisung, eine Zeile für jede Position ist wichtig). Es gibt zwei Möglichkeiten, eine Position zu identifizieren. Der erste ist nach Ort und nach dem Grafen innerhalb des Ortes (poseqnum). Die zweite ist durch eine inkrementelle ID in den Zeilen.

Ermitteln Sie die aktuelle Position in der Tabelle für jeden Manager. Dies sollte einzigartig sein, da ich die Anzahl der Manager an jedem Ort berücksichtige. Fügen Sie dann der Position einen Offset hinzu und weisen Sie diesen Bereich zu. Wenn der Offset größer ist als der maxseqnum, wird der Manager sicher zu einem anderen Standort wechseln (außer in ungewöhnlichen Grenzfällen, wo ein Standort mehr als die Hälfte der Manager hat).

Wenn alle aktuellen Managerpositionen besetzt sind, garantiert dies, dass alle zum nächsten Standort wechseln. Da ManagerPositions eine zufällige ID für die Zuweisung von seqnum verwendet, ist der "nächste" Platz zufällig, nicht als nächstes nach ID oder alphabetisch.

Bei dieser Lösung reisen viele Mitarbeiter gemeinsam an denselben neuen Standort. Sie können dies etwas beheben, indem Sie im Ausdruck (m.seqnum+maxposseqnum+1) andere Werte als "1" versuchen.

Ich stelle fest, dass es eine Möglichkeit gibt, dies zu ändern, um die Korrelation zwischen dem aktuellen Ort und dem nächsten Ort zu verhindern. Das macht folgendes:

  1. Weist seqnum zufällig ManagerPosition zu
  2. zu
  3. Vergleichen Sie verschiedene Offsets in der Tabelle, indem Sie die Anzahl der Wiederholungen angeben, um die zwei Positionen in der Tabelle, die durch diesen Offset getrennt sind, gleich sind.
  4. Wählen Sie den Offset mit der Mindestbewertung (vorzugsweise 0).
  5. Verwenden Sie diesen Offset in der letzten übereinstimmenden Klausel.

Ich habe momentan nicht genug Zeit, um das SQL dafür zu schreiben.

    
Gordon Linoff 22.09.2012 16:06
quelle