Angenommen, ich habe eine einfache Tabelle mit drei Feldern: 'Ort', 'Benutzer' und 'Byte'. Nehmen wir an, dass ich unter einem Filter nach "place" gruppieren möchte und für jeden "place" alle Bytes für diesen Platz summiere und zufällig einen Benutzer für diesen Platz auswähle (einheitlich von allen Benutzern, die zu diesem Platz passen) 'where' Filter und der relevante 'Ort'). Wenn es eine "Auswahl zufällig von" Aggregatfunktion gäbe, würde ich tun:
%Vor%... aber ich konnte eine solche Aggregatfunktion nicht finden. Fehle ich etwas? Was könnte ein guter Weg sein, dies zu erreichen?
Wenn Ihr RDBMS analytische Funktionen unterstützt.
%Vor% Für SQL Server Crypt_gen_random(4)
oder NEWID()
wären Beispiele für etwas, das in random_function()
Ich denke, Ihre Frage ist DBMS-spezifisch. Wenn Ihr DBMS MySql ist, können Sie eine Lösung wie folgt verwenden:
%Vor% Die Unterabfrage ordnet Datensätze in zufälliger Reihenfolge an. Die äußere Abfrage gruppiert nach place
, summiert bytes
und gibt den ersten zufälligen Benutzer zurück, da sich der Benutzer nicht in einer Aggregatfunktion und auch nicht in der group by-Klausel befindet.
Ich würde Martins Lösung ein wenig variieren:
%Vor%(wobei newid () nur eine Möglichkeit ist, eine Zufallszahl zu erhalten, abhängig von der Datenbank.)
Aus irgendeinem Grund bevorzuge ich diesen Ansatz, weil er immer noch die Aggregationsfunktion in der äußeren Abfrage hat. Wenn Sie eine Reihe von Feldern zusammenfassen, dann scheint mir das sauberer zu sein.
Mit einer benutzerdefinierten Aggregatfunktion können Sie Ausdrücke so einfach schreiben wie:
%Vor% SELECT_AT_RAMDOM
wäre die benutzerdefinierte Aggregatfunktion.
Hier ist genau eine Implementierung in PostgreSQL .
Tags und Links sql aggregate-functions