2014-03-07 6 views
6

Ich bin gerade über jOOQ's maxDistinct SQL aggregation function gestolpert.Was ist MAX (DISTINCT x) in SQL?

Was unterscheidet MAX(DISTINCT x) von nur MAX(x)?

+2

kein Unterschied .... – zzlalani

+4

Ich würde vermuten, dass es nur für die Konsistenz mit den anderen Aggregaten, für die unterschiedliche und nicht eindeutige Aggregation unterschiedliche Werte erzeugen könnte. –

+1

@Damien_The_Unbeliever: +1. Ich denke, das würde es auf SQL-Ebene erklären. Hält Ihre BNF einfach. Aber warum sollten die Leute es in ihre handcodierte Persistenzbibliothek aufnehmen (wo das Hinzufügen eine zusätzliche Anstrengung ist). – Thilo

Antwort

0

Wenn ich mich nicht falsch es gibt keinen Unterschied

für Spalten

ID 
1 
2 
2 
3 
3 
4 
5 
5 

Die OUTPUT für beide dert sind gleiche 5

MAX(DISTINCT x) 

// ID = 1,2,2,3,3,4,5,5 
// DISTINCT = 1,2,3,4,5 
// MAX = 5 
// 1 row 

und für

MAX(x) 

// ID = 1,2,2,3,3,4,5,5 
// MAX = 5 
// 1 row 
4

maxDistinct und minDistinct wurden definiert, um die Konsistenz mit den anderen Aggregatfunktionen beizubehalten, bei denen eine unterschiedliche Option tatsächlich einen Unterschied macht (z. B. countDistinct, sumDistinct).

Da das Maximum (oder Minimum), das zwischen den verschiedenen Werten eines Datensatzes berechnet wird, mathematisch dem einfachen Maximum (oder Minimum) desselben Satzes entspricht, sind diese Funktionen im Wesentlichen redundant.

0

Theoretisch stellt DISTINCT x sicher, dass sich jedes Element von einem bestimmten Satz unterscheidet. Der Operator max wählt den höchsten Wert aus einer Menge aus. In reinem SQL sollte es keinen Unterschied zwischen beiden geben.

1

Kurz gesagt, wird es keinen Unterschied geben. Im Fall von MySQL ist es sogar in manual page:

Gibt den Maximalwert von Ausdruck zurück. MAX() kann ein String-Argument nehmen; In solchen Fällen gibt es den maximalen Zeichenfolgenwert zurück. Siehe Abschnitt 8.5.3, "Wie MySQL Indizes verwendet". Das DISTINCT-Schlüsselwort kann verwendet werden, um das Maximum der verschiedenen Werte von Ausdruck zu finden, jedoch erzeugt dies das gleiche Ergebnis wie das Auslassen von DISTINCT.

Der Grund, warum es möglich ist - ist, weil Kompatibilität mit anderen Plattformen zu halten. Intern wird es keinen Unterschied geben - MySQL wird nur den Einfluss von DISTINCT weglassen. Es wird nicht versucht, etwas mit einer Menge von Reihen zu tun (d. H., Zuerst eine bestimmte Menge erzeugen). Für indizierte Spalten ist es Select tables optimized away (liest also einen Wert aus dem Index, keine Tabelle), für nicht indizierte - full scan.