SQL zufälliges Aggregat

8

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?

    
R S 18.11.2012, 14:19
quelle

4 Antworten

5

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()

ersetzt werden könnte     
Martin Smith 18.11.2012 14:34
quelle
2

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.

    
fthiella 18.11.2012 15:27
quelle
0

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.

    
Gordon Linoff 18.11.2012 23:24
quelle
0

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 .

    
jgomo3 14.10.2017 22:22
quelle

Tags und Links