SQL-Aggregatfunktion für jeden nicht spezifischen Wert aus einer Gruppe

8

Gibt es eine aggregate-Funktion, die einen beliebigen Wert aus einer Gruppe zurückgibt. Ich könnte MIN oder MAX verwenden, würde aber den Overhead möglichst vermeiden, wenn es ein Textfeld ist.

Meine Situation ist eine Zusammenfassung des Fehlerprotokolls. Die Fehler sind nach der Art des Fehlers gruppiert, und für jede Gruppe wird ein Beispiel für den Fehlertext angezeigt. Es spielt keine Rolle, welche Fehlermeldung als Beispiel verwendet wird.

%Vor%

Was kann ich MIN(data) ersetzen, um 100.000 von varchar (2000) Werten nicht vergleichen zu müssen?

    
Hand-E-Food 09.01.2013, 00:55
quelle

3 Antworten

3

Nach den vorgeschlagenen Antworten scheint MIN(data) (oder MAX(data) ) der schnellste Weg zu sein, um das zu erreichen, was ich will. Ich versuche unnötigerweise zu viel zu optimieren.

Ich werde alle anderen Antworten ausprobieren, die auftauchen, während ich Zugang zu dieser Datenbank habe, aber in der Zwischenzeit kommt das oben heraus.

Danke für alle Bemühungen!

    
Hand-E-Food 10.01.2013, 01:09
quelle
4

Sie können MIN mit KEEP verbinden, wie folgt:

%Vor%

Die Idee dahinter ist, dass die Datenbank-Engine Daten über ROWID statt der VARCHAR (2000) -Werte sortiert, was theoretisch schneller sein sollte. Sie können ROWID durch den Primärschlüsselwert ersetzen und überprüfen, ob es schneller ist

    
cha 09.01.2013 03:08
quelle
2

Nun, da du nach OVER PARTITION AND ORDER BY gefragt hast, ist unten eine Version, die deine GROUP BY ausführt, aber auch ROW_NUMBER () mit OVER und PARTITION AND ORDER BY, um die erste ref_code, log_type, error_num Kombination zu nummerieren across als Zeile Nummer 1 (mit welcher Daten Spalte ist es bei 1). Dann nummeriert es, beginnend bei 1, bei der nächsten eindeutigen ref_code, log_type, error_num -Kombination, die es findet (mit der Datenspalte, die zufällig dort ist). Sie können also einfach das Datenfeld bei Zeile 1 als repräsentatives Datenfeld für eine gegebene ref_code, log_type, error_num ziehen.

Es fehlt noch etwas. Es wäre eleganter, wenn ich nicht den doppelten Durchlauf hätte (einmal für die Aggregation und einmal für row_number ()); es kann jedoch trotzdem sehr gut funktionieren. Ich muss noch genauer darüber nachdenken, ob ich den Doppelpass eliminieren kann.

Aber es vermeidet einen Vergleich des großen Datenfeldes. Und es ist eine Möglichkeit, das zu tun, was Sie gefragt haben: 1 repräsentative Stichprobe aus dem Datenfeld in Korrelation mit den aggregierten Feldern zu ziehen.

%Vor%

Abschließender Vorbehalt: Ich habe kein Oracle, um dies zu versuchen. Aber ich habe es aus dem Lesen der Oracle Dokumentation zusammengestellt.

Ich fügte das unten hinzu, nachdem ich weiter darüber nachgedacht hatte, wie ich die GROUP BY eliminieren sollte, die ich nur für COUNT (*) hatte. Ich weiß nicht, ob es schneller geht.

%Vor%     
DWright 09.01.2013 05:58
quelle

Tags und Links