Gibt es einen Unterschied zwischen GROUP BY und DISTINCT?


310

Ich habe neulich etwas Einfaches über SQL gelernt:

SELECT c FROM myTbl GROUP BY C

Hat das gleiche Ergebnis wie:

SELECT DISTINCT C FROM myTbl

Worauf ich neugierig bin, gibt es etwas anderes in der Art und Weise, wie eine SQL-Engine den Befehl verarbeitet, oder sind sie wirklich dasselbe?

Ich persönlich bevorzuge die unterschiedliche Syntax, aber ich bin mir sicher, dass dies eher aus Gewohnheit als aus irgendetwas anderem geschieht.

EDIT: Dies ist keine Frage zu Aggregaten. Die Verwendung GROUP BYmit Aggregatfunktionen wird verstanden.


11
Dies ist keine Frage zu Aggregaten, sondern eine GROUP BY-Funktion, die genauso funktioniert wie eine eindeutige Funktion, wenn keine Aggregatfunktion vorhanden ist
Brettski,

2
Sie können auch SELECT c FROM myTbl UNION SELECT c FROM myTbldas gleiche Ergebnis erzielen ... Aber warum sollten Sie die Dinge komplizieren, wenn SELECT DISTINCT so einfach ist?
Jarlh

Die 'logische Ausführungsreihenfolge' von GROUP BYist viel früher als 'SELECT' und DISTINCTfolgt select.
Used_By_Already

Ein sehr kleiner Unterschied, den ich nicht erwähnt habe, besteht darin, dass DISTINCTdas Feld tatsächlich ausgewählt wird - dh der Wert wird in der Ergebnismenge angezeigt. GROUP BYkann Duplikate effektiv entfernen, ohne das Feld tatsächlich auszuwählen. Dies ist in den meisten Fällen etwas irrelevant, könnte aber genau das sein, was Sie in anderen wollen. Wenn Sie GROUP BYanstelle von verwenden DISTINCT, ist wahrscheinlich ein erläuternder Kommentar im Code gerechtfertigt.
Rinogo

Die Quintessenz scheint zu sein, dass, da das Entfernen von Duplikaten an verschiedenen Stellen im Ausführungsplan erfolgt, eines effizienter sein kann als das andere, da das Entfernen von Dup eine Sortierung oder möglicherweise Verwendung dieses Index über diesen Index erfordert. Daher kann die frühzeitige Entfernung von Dup einen Vorteil haben, oder der Vorteil kann sich aus der frühzeitigen Verwendung eines anderen Index und dem späteren Verzehr einer Sorte ergeben, wenn nur noch wenige Zeilen übrig sind und die Sortierung vernachlässigbar ist.
Bielawski

Antworten:


246

Die Antwort von MusiGenesis ist funktional die richtige in Bezug auf Ihre Frage, wie angegeben. Der SQL Server ist intelligent genug, um zu erkennen, dass Sie, wenn Sie "Gruppieren nach" verwenden und keine Aggregatfunktionen verwenden, "Distinct" meinen - und daher einen Ausführungsplan generieren, als ob Sie einfach "Distinct" verwendet hätten . "

Ich denke jedoch, dass es wichtig ist, auch Hanks Reaktion zu beachten - eine unbekümmerte Behandlung von "Group By" und "Distinct" könnte zu einigen schädlichen Fallstricken führen, wenn Sie nicht vorsichtig sind. Es ist nicht ganz richtig zu sagen, dass dies "keine Frage zu Aggregaten" ist, da Sie nach dem funktionalen Unterschied zwischen zwei SQL-Abfrageschlüsselwörtern fragen, von denen eines für Aggregate verwendet werden soll und eines nicht.

Ein Hammer kann manchmal funktionieren, um eine Schraube einzuschlagen, aber wenn Sie einen Schraubenzieher zur Hand haben, warum dann?

(für die Zwecke dieser Analogie Hammer : Screwdriver :: GroupBy : Distinctund screw => get list of unique values in a table column)


Ich stimme Ihnen voll und ganz zu, Skeolan. Ich war ziemlich überrascht, als ich auf diese Funktionalität stieß. Es ist nicht etwas, das ich verwenden möchte, aber eine Art und Weise, wie Dinge an diesem neuen Ort, an dem ich arbeite, getan wurden.
Brettski

Zumindest in Oracle 12 scheint es Fälle zu geben, in denen DISTINCT, das Abrufen unterschiedlicher Werte durch UNION und GROUP BY unterschiedlich funktionieren. Ich hatte heute gerade einen Fall, in dem DISTINCT und UNION einen Oracle-Fehler verursachen, aber GROUP BY hat funktioniert. Ich habe nur eine Spalte aus einer Ansicht ausgewählt und keine Aggregation verwendet. Ich bin immer noch verblüfft, warum es erforderlich war, aber es bestätigt, dass es einen Unterschied in der Ausführung gibt. Wie andere hervorheben, können Sie damit auch GROUP BY-Spalten auswählen, die nicht in der Auswahl enthalten sind. Dies sollte jedoch ohne Aggregation selten erforderlich sein.
ZeroK

1
Wenn es um SQL geht, haben Sie immer sowohl einen Schraubendreher als auch einen Hammer zur Verfügung. Warum mit einem Hammer eine Schraube einschlagen?
Jarlh

Nur um in Bezug auf Ihre Analogie klar zu sein - ist Ihr Hammer == GroupBy und Schraubendreher == in diesem Fall unterschiedlich?
HopeKing

Wow, diese zehnjährige Frage hat immer noch Beine! "Distinct" ist der Schraubendreher, wenn "Liste der eindeutigen Werte" die Schraube ist. Ich werde die Antwort aktualisieren, um die Analogie klarer zu machen.
Skeolan

136

GROUP BYlassen Sie Aggregatfunktionen verwenden, wie AVG, MAX, MIN, SUM, und COUNT. Auf der anderen Seite werden DISTINCTnur Duplikate entfernt.

Wenn Sie beispielsweise eine Reihe von Kaufunterlagen haben und wissen möchten, wie viel von jeder Abteilung ausgegeben wurde, können Sie Folgendes tun:

SELECT department, SUM(amount) FROM purchases GROUP BY department

Dadurch erhalten Sie eine Zeile pro Abteilung, die den Abteilungsnamen und die Summe aller amountWerte in allen Zeilen für diese Abteilung enthält.


2
Die Verwendung von GROUP BY Ich verstehe, Die Frage basiert auf der Tatsache, dass es einen bestimmten Datensatz zurückgibt, wenn keine Aggregatfunktion vorhanden ist.
Brettski

2
Weil GROUP BY implizit ein DISTINCT über die Werte der Spalte ausführt, nach der Sie gruppieren (Entschuldigung für die Kakophonie).
Joe Pineda

Ist es nicht möglich, DISTINCT+ Aggregatfunktionen zu verwenden? wie select distinct department, SUM(amount) from ...
folgt

@Sajad, das kannst du ja, aber du musst immer noch die GROUP BY haben, damit das DISTINCT nichts für dich tut.
ZeroK

44

Es gibt keinen Unterschied (zumindest in SQL Server). Beide Abfragen verwenden denselben Ausführungsplan.

http://sqlmag.com/database-performance-tuning/distinct-vs-group

Vielleicht gibt es einen Unterschied, wenn es sich um Unterabfragen handelt:

http://blog.sqlauthority.com/2007/03/29/sql-server-difference-between-distinct-and-group-by-distinct-vs-group-by/

Es gibt keinen Unterschied (Oracle-Stil):

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:32961403234212


40

Was ist der Unterschied aus Sicht der Funktionalität zum Entfernen von Duplikaten?

Abgesehen von der Tatsache , dass im Gegensatz zu DISTINCT, GROUP BYermöglicht die Aggregation der Daten pro Gruppe (die von vielen anderen Antworten erwähnt wurde), der wichtigste Unterschied meiner Meinung nach ist die Tatsache , dass die beiden Operationen „passieren“ an zwei sehr unterschiedlichen Schritten in der logischen Reihenfolge von Operationen, die in einer SELECTAnweisung ausgeführt werden .

Hier sind die wichtigsten Operationen:

  • FROM(einschließlich JOIN, APPLYusw.)
  • WHERE
  • GROUP BY (kann Duplikate entfernen)
  • Aggregationen
  • HAVING
  • Fensterfunktionen
  • SELECT
  • DISTINCT (kann Duplikate entfernen)
  • UNION, INTERSECT, EXCEPT (Können Duplikate entfernen)
  • ORDER BY
  • OFFSET
  • LIMIT

Wie Sie sehen können, beeinflusst die logische Reihenfolge jeder Operation, was damit gemacht werden kann und wie sie nachfolgende Operationen beeinflusst. Insbesondere bedeutet die Tatsache, dass die GROUP BYOperation "vor" der SELECTOperation (der Projektion) stattfindet, dass:

  1. Es hängt nicht von der Projektion ab (was von Vorteil sein kann)
  2. Es können keine Werte aus der Projektion verwendet werden (was ein Nachteil sein kann).

1. Es hängt nicht von der Projektion ab

Ein Beispiel, bei dem es nicht sinnvoll ist, von der Projektion abhängig zu sein, ist, wenn Sie Fensterfunktionen für bestimmte Werte berechnen möchten:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film
GROUP BY rating

Wenn es mit der Sakila-Datenbank ausgeführt wird , ergibt dies:

rating   rn
-----------
G        1
NC-17    2
PG       3
PG-13    4
R        5

Dasselbe konnte nicht einfach erreicht DISTINCTwerden:

SELECT DISTINCT rating, row_number() OVER (ORDER BY rating) AS rn
FROM film

Diese Abfrage ist "falsch" und ergibt so etwas wie:

rating   rn
------------
G        1
G        2
G        3
...
G        178
NC-17    179
NC-17    180
...

Das wollten wir nicht. Die DISTINCTOperation "erfolgt nach" der Projektion, sodass wir DISTINCTBewertungen nicht mehr entfernen können, da die Fensterfunktion bereits berechnet und projiziert wurde. Um zu verwenden DISTINCT, müssten wir diesen Teil der Abfrage verschachteln:

SELECT rating, row_number() OVER (ORDER BY rating) AS rn
FROM (
  SELECT DISTINCT rating FROM film
) f

Randnotiz: In diesem speziellen Fall könnten wir auch verwendenDENSE_RANK()

SELECT DISTINCT rating, dense_rank() OVER (ORDER BY rating) AS rn
FROM film

2. Es können keine Werte aus der Projektion verwendet werden

Einer der Nachteile von SQL ist die zeitweise Ausführlichkeit. Aus dem gleichen Grund wie dem, was wir zuvor gesehen haben (nämlich der logischen Reihenfolge der Operationen), können wir nicht einfach nach etwas gruppieren, das wir projizieren.

Dies ist ungültiges SQL:

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY name

Dies ist gültig (Wiederholung des Ausdrucks)

SELECT first_name || ' ' || last_name AS name
FROM customer
GROUP BY first_name || ' ' || last_name

Dies gilt auch (Verschachtelung des Ausdrucks)

SELECT name
FROM (
  SELECT first_name || ' ' || last_name AS name
  FROM customer
) c
GROUP BY name

Ich habe in einem Blog-Beitrag ausführlicher über dieses Thema geschrieben


Ich war ehrlich überrascht zu sehen, dass die Reihenfolge der Ausführung in dieser Frage nicht sofort besprochen wurde. Danke, auch sehr schön erklärt. In Punkt 2 erlauben einige (eine?) Datenbank die Verwendung ausgewählter Aliase in der gesamten Abfrage (die mir bekannte ist Teradata, aber es ist eine Ausnahme).
Used_By_Already

@Used_By_Already: Sicher, einige Datenbanken machen das. Viele Datenbanken erlauben die Verwendung dieser Aliase nur in Teilen (z. B. nicht, WHEREaber vielleicht GROUP BY). Auf jeden Fall halte ich es für eine schlechte Idee und schlage vor, diese Funktion aus Gründen der Portabilität und Wartung niemals zu verwenden. "Plötzlich" funktioniert es nicht mehr, z. B. beim Aliasing einer Aggregat- oder Fensterfunktion.
Lukas Eder

never using that feature for portability and maintenance reasons!! stimmte zu 100% zu ... & ich schreibe jetzt auch Ihren Blog auf, großartige Arbeit. Prost.
Used_By_Already

32

Verwenden DISTINCTSie diese Option, wenn Sie nur Duplikate entfernen möchten. Verwenden GROUPY BYSie diese Option, wenn Sie Aggregatoperatoren anwenden möchten ( MAX,SUM , GROUP_CONCAT, ..., oder eine HAVINGKlausel).


19

Ich gehe davon aus, dass die Möglichkeit subtiler Unterschiede in ihrer Ausführung besteht. Ich habe die Ausführungspläne in Oracle 10g auf zwei funktional äquivalente Abfragen in dieser Richtung überprüft:

core> select sta from zip group by sta;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH GROUP BY     |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

core> select distinct sta from zip;

---------------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |    58 |   174 |    44  (19)| 00:00:01 |
|   1 |  HASH UNIQUE       |      |    58 |   174 |    44  (19)| 00:00:01 |
|   2 |   TABLE ACCESS FULL| ZIP  | 42303 |   123K|    38   (6)| 00:00:01 |
---------------------------------------------------------------------------

Die mittlere Operation unterscheidet sich geringfügig: "HASH GROUP BY" vs. "HASH UNIQUE", aber die geschätzten Kosten usw. sind identisch. Ich habe diese dann mit aktivierter Ablaufverfolgung ausgeführt und die tatsächlichen Operationszahlen waren für beide gleich (außer dass der zweite aufgrund von Caching keine physischen Lesevorgänge durchführen musste).

Ich denke jedoch, dass die Ausführung, da die Operationsnamen unterschiedlich sind, etwas anderen Codepfaden folgen würde, was die Möglichkeit signifikanterer Unterschiede eröffnet.

Ich denke, Sie sollten zu diesem Zweck die DISTINCT-Syntax bevorzugen. Es ist nicht nur Gewohnheit, es zeigt deutlicher den Zweck der Abfrage an.


14

Für die von Ihnen gepostete Abfrage sind sie identisch. Aber für andere Fragen, die möglicherweise nicht zutreffen.

Zum Beispiel ist es nicht dasselbe wie:

SELECT C FROM myTbl GROUP BY C, D

14

Ich habe alle obigen Kommentare gelesen, aber außer dem Aggregationsbit hat niemand auf den Hauptunterschied zwischen Group By und Distinct hingewiesen.

Distinct gibt alle Zeilen zurück und dupliziert sie dann, während Group By die Zeilen de-dedupliziert, wenn sie einzeln vom Algorithmus gelesen werden.

Dies bedeutet, dass sie unterschiedliche Ergebnisse erzielen können!

Die folgenden Codes führen beispielsweise zu unterschiedlichen Ergebnissen:

SELECT distinct ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable

 SELECT ROW_NUMBER() OVER (ORDER BY Name), Name FROM NamesTable
GROUP BY Name

Wenn die Tabelle 10 Namen enthält, von denen 1 ein Duplikat eines anderen ist, gibt die erste Abfrage 10 Zeilen zurück, während die zweite Abfrage 9 Zeilen zurückgibt.

Der Grund ist, was ich oben gesagt habe, damit sie sich anders verhalten können!


11
Dies liegt daran Name, dass das distinctSchlüsselwort, während Sie nur in der zweiten Abfrage gruppieren , sowohl für die Spalten Nameals auch für Ihre ROW_NUMBER()Spalte in der selectKlausel der ersten Abfrage gilt. Wenn Sie in der zweiten Abfrage auch nach der ersten Spalte gruppiert hätten, hätten die Abfragen dieselben Ergebnisse zurückgegeben.

Dies ist ein Ergebnis der order of executionvon den SQL - Klauseln , die (im allgemeinen Sinne) sind FROM and ON (joins), WHERE, GROUP BY, HAVING, SELECT, DISTINCT, ORDER BY, , LIMIT / OFFSET / TOPso dass die zweite Abfrage , um die Namen , die von der Anzahl von Gruppen reduziert werden , und später die row_number () ist in einer Reihe angelegt resultierend pro eindeutigem Namen. In der ersten Abfrage wird row_number () angewendet, bevor die eindeutige Funktion angewendet wird. Aufgrund der Art der Funktion row_number () erhält jede Zeile eine eindeutige Ganzzahl. Daher wird jede Zeile zurückgegeben, auch wenn wiederholte Namenswerte vorhanden sind.
Used_By_Already

12

Wenn Sie DISTINCT mit mehreren Spalten verwenden, wird die Ergebnismenge nicht wie bei GROUP BY gruppiert, und Sie können mit DISTINCT keine Aggregatfunktionen verwenden.


11

Sie haben unterschiedliche Semantiken, auch wenn sie zufällig äquivalente Ergebnisse für Ihre bestimmten Daten haben.


6

GROUP BY hat eine sehr spezifische Bedeutung, die sich von der DISTINCT-Funktion unterscheidet (heh).

GROUP BY bewirkt, dass die Abfrageergebnisse mit dem ausgewählten Ausdruck gruppiert werden. Anschließend können Aggregatfunktionen angewendet werden, die auf jede Gruppe und nicht auf die gesamte Ergebnismenge angewendet werden.

Hier ist ein Beispiel, das helfen könnte:

Bei einer Tabelle, die so aussieht:

name
------
barry
dave
bill
dave
dave
barry
john

Diese Abfrage:

SELECT name, count(*) AS count FROM table GROUP BY name;

Erzeugt eine Ausgabe wie folgt:

name    count
-------------
barry   2
dave    3
bill    1
john    1

Was sich offensichtlich stark von der Verwendung von DISTINCT unterscheidet. Wenn Sie Ihre Ergebnisse gruppieren möchten, verwenden Sie GROUP BY. Wenn Sie nur eine eindeutige Liste einer bestimmten Spalte wünschen, verwenden Sie DISTINCT. Dies gibt Ihrer Datenbank die Möglichkeit, die Abfrage für Ihre Anforderungen zu optimieren.


6

Bitte verwenden Sie GROUP BY nicht, wenn Sie DISTINCT meinen, auch wenn sie zufällig gleich funktionieren. Ich gehe davon aus, dass Sie versuchen, Millisekunden von Abfragen zu sparen, und ich muss darauf hinweisen, dass die Entwicklerzeit um Größenordnungen teurer ist als die Computerzeit.


5

Wenn Sie ein GROUP BY ohne Aggregatfunktion verwenden, wird es intern als DISTINCT behandelt. In diesem Fall gibt es also keinen Unterschied zwischen GROUP BY und DISTINCT.

Wenn Sie jedoch eine DISTINCT-Klausel erhalten, sollten Sie diese besser zum Auffinden Ihrer eindeutigen Datensätze verwenden, da das Ziel von GROUP BY darin besteht, eine Aggregation zu erreichen.


4

group by wird in aggregierten Operationen verwendet - beispielsweise, wenn Sie eine Anzahl von Bs erhalten möchten, die nach Spalte C aufgeschlüsselt sind

select C, count(B) from myTbl group by C

Unterscheidbar ist, wie es sich anhört - Sie erhalten eindeutige Zeilen.

In SQL Server 2005 sieht es so aus, als ob der Abfrageoptimierer den Unterschied in den vereinfachten Beispielen, die ich ausgeführt habe, beseitigen kann. Keine Ahnung, ob Sie sich in allen Situationen darauf verlassen können.


3

In dieser speziellen Abfrage gibt es keinen Unterschied. Wenn Sie jedoch aggregierte Spalten hinzufügen, müssen Sie natürlich Gruppieren nach verwenden.


3

In Teradata-Perspektive :

Aus Sicht der Ergebnismenge spielt es keine Rolle, ob Sie in Teradata DISTINCT oder GROUP BY verwenden. Der Antwortsatz ist der gleiche.

Aus Sicht der Leistung ist es nicht dasselbe.

Um zu verstehen, was sich auf die Leistung auswirkt, müssen Sie wissen, was auf Teradata passiert, wenn Sie eine Anweisung mit DISTINCT oder GROUP BY ausführen.

Im Fall von DISTINCT werden die Zeilen sofort neu verteilt, ohne dass eine Vorabregulierung stattfindet, während im Fall von GROUP BY in einem ersten Schritt eine Vorabregulierung durchgeführt wird und erst dann die eindeutigen Werte über die AMPs neu verteilt werden.

Denken Sie jetzt nicht, dass GROUP BY aus Sicht der Leistung immer besser ist. Wenn Sie viele verschiedene Werte haben, ist der Voraggregationsschritt von GROUP BY nicht sehr effizient. Teradata muss die Daten sortieren, um Duplikate zu entfernen. In diesem Fall ist es möglicherweise besser, zuerst die Umverteilung vorzunehmen, dh die Anweisung DISTINCT zu verwenden. Nur wenn viele doppelte Werte vorhanden sind, ist die Anweisung GROUP BY wahrscheinlich die bessere Wahl, da der Deduplizierungsschritt erst nach der Umverteilung erfolgt.

Kurz gesagt bedeutet DISTINCT vs. GROUP BY in Teradata:

GROUP BY -> für viele Duplikate DISTINCT -> keine oder nur wenige Duplikate. Wenn Sie DISTINCT verwenden, geht Ihnen manchmal der Spool-Speicherplatz auf einem AMP aus. Der Grund dafür ist, dass die Umverteilung sofort erfolgt und das Versetzen dazu führen kann, dass AMPs nicht mehr genügend Platz haben.

In diesem Fall haben Sie mit GROUP BY wahrscheinlich eine bessere Chance, da Duplikate bereits in einem ersten Schritt entfernt werden und weniger Daten über die AMPs verschoben werden.


Was ist Teradata?
Brettski

Teradata ist ein relationales Datenbankverwaltungssystem (RDBMS), das viele gleichzeitige Benutzer von verschiedenen Clientplattformen unterstützen kann. Teradata ist mit dem ANSI-Standard kompatibel und basiert vollständig auf paralleler Architektur.
Ram Ghadiyaram

2

Aus der Perspektive von "SQL the language" sind die beiden Konstrukte gleichwertig und welches Sie wählen, ist eine dieser "Lifestyle" -Entscheidungen, die wir alle treffen müssen. Ich denke, es gibt einen guten Grund dafür, dass DISTINCT expliziter ist (und daher für die Person, die Ihren Code usw. erbt, rücksichtsvoller ist), aber das bedeutet nicht, dass das GROUP BY-Konstrukt eine ungültige Wahl ist.

Ich denke, diese "GROUP BY ist für Aggregate" ist die falsche Betonung. Die Leute sollten sich bewusst sein, dass die eingestellte Funktion (MAX, MIN, COUNT usw.) weggelassen werden kann, damit sie die Absicht des Codierers verstehen können, wenn dies der Fall ist.

Der ideale Optimierer erkennt äquivalente SQL-Konstrukte und wählt immer den idealen Plan entsprechend aus. Für Ihre echte SQL-Engine Ihrer Wahl müssen Sie testen :)

PS: Beachten Sie, dass die Position des Schlüsselworts DISTINCT in der select-Klausel zu unterschiedlichen Ergebnissen führen kann, z. B. Kontrast:

SELECT COUNT(DISTINCT C) FROM myTbl;

SELECT DISTINCT COUNT(C) FROM myTbl;

1

Sie bemerken das nur, weil Sie eine einzelne Spalte auswählen.

Wählen Sie zwei Felder aus und sehen Sie, was passiert.

Group By soll wie folgt verwendet werden:

SELECT name, SUM(transaction) FROM myTbl GROUP BY name

Welches würde die Summe aller Transaktionen für jede Person anzeigen.


Dies ist keine Frage von Aggregaten. In Ihrem Beispiel wählen Sie c, d FROM mytbl GROUP BY C, D; gibt tatsächlich den gleichen Datensatz zurück wie SELECT DISTINCT C, D FROM mytbl; Dies ist die Grundlage der Frage
Brettski

1

Ich weiß, dass es ein alter Beitrag ist. Aber es kommt vor, dass ich eine Abfrage hatte, bei der nur Gruppen verwendet wurden, um unterschiedliche Werte zurückzugeben, wenn diese Abfrage in Kröten- und Orakelberichten verwendet wurde. Alles hat gut funktioniert. Ich meine eine gute Antwortzeit. Bei der Migration von Oracle 9i auf 11g war die Antwortzeit in Toad ausgezeichnet, aber im Bericht dauerte es ungefähr 35 Minuten, um den Bericht fertigzustellen, wenn die vorherige Version verwendet wurde, dauerte es ungefähr 5 Minuten.

Die Lösung bestand darin, die Gruppe durch DISTINCT zu ändern und zu verwenden. Jetzt wird der Bericht in etwa 30 Sekunden ausgeführt.

Ich hoffe, dass dies für jemanden mit der gleichen Situation nützlich ist.


1

In Bezug auf die Verwendung wird GROUP BY zum Gruppieren der Zeilen verwendet, die Sie berechnen möchten. DISTINCT führt keine Berechnung durch. Es werden keine doppelten Zeilen angezeigt.

Ich habe immer DISTINCT verwendet, wenn ich Daten ohne Duplikate präsentieren möchte.

Wenn ich Berechnungen wie das Aufsummieren der Gesamtmenge an Mangos durchführen möchte, verwende ich GROUP BY


0

Ich habe es immer so verstanden, dass die Verwendung von "Unterschiedlich" der Gruppierung nach jedem Feld entspricht, das Sie in der Reihenfolge ausgewählt haben, in der Sie sie ausgewählt haben.

dh:

select distinct a, b, c from table;

ist das gleiche wie:

select a, b, c from table group by a, b, c

Einverstanden, aber wäre es dasselbe wie c, b, a aus der Tabellengruppe von a, b, c
auswählen

Ja, es wäre das gleiche
Caius Jard

0

Die funktionale Effizienz ist völlig anders. Wenn Sie nur "Rückgabewert" außer dem doppelten auswählen möchten, ist die Verwendung von "Unterschied" besser als "Gruppieren nach". Da "gruppieren nach" einschließen (Sortieren + Entfernen), "unterscheiden" einschließen (Entfernen)



0

Manchmal liefern sie die gleichen Ergebnisse, aber sie sollen in einem anderen Sinne / Fall verwendet werden. Der Hauptunterschied liegt in der Syntax.

Beachten Sie das folgende Beispiel genau. DISTINCTwird verwendet, um den doppelten Wertesatz herauszufiltern. (6, cs, 9.1) und (1, cs, 5.5) sind zwei verschiedene Mengen. Es werden also DISTINCTbeide Zeilen angezeigt, während GROUP BY Branchnur ein Satz angezeigt wird.

 SELECT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT DISTINCT * FROM student; 
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    2 | mech   |  6.3 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    1 | cs     |  5.5 |
+------+--------+------+
5 rows in set (0.001 sec)

SELECT * FROM student GROUP BY Branch;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    3 | civil  |  7.2 |
|    6 | cs     |  9.1 |
|    4 | eee    |  8.2 |
|    2 | mech   |  6.3 |
+------+--------+------+
4 rows in set (0.001 sec)

Manchmal GROUP BYist es nicht möglich, die Ergebnisse zu erzielen, die mit Klausel erzielt werden könnenDISTINCT ohne eine zusätzliche Klausel oder Bedingungen zu verwenden. ZB im obigen Fall.

Um das gleiche Ergebnis zu DISTINCTerzielen, müssen Sie alle Spaltennamen in der folgenden GROUP BYKlausel übergeben. Sehen Sie sich also den syntaktischen Unterschied an. Sie müssen Kenntnisse über alle Spaltennamen haben, um GROUP BYin diesem Fall die Klausel verwenden zu können.

SELECT * FROM student GROUP BY Id, Branch, CGPA;
+------+--------+------+
| Id   | Branch | CGPA |
+------+--------+------+
|    1 | cs     |  5.5 |
|    2 | mech   |  6.3 |
|    3 | civil  |  7.2 |
|    4 | eee    |  8.2 |
|    6 | cs     |  9.1 |
+------+--------+------+

Außerdem habe ich festgestellt, dass GROUP BYdie Ergebnisse standardmäßig in aufsteigender Reihenfolge angezeigt werden, was DISTINCTnicht der Fall ist. Da bin ich mir aber nicht sicher. Dies kann vom Hersteller abweichen.

Quelle: https://dbjpanda.me/dbms/languages/sql/sql-syntax-with-examples#group-by


0

Im Allgemeinen können wir DISTINCTdie Duplikate für bestimmte Spalten in der Tabelle entfernen.

Im Falle der ‚GROUP BY‘ können wir die Aggregationsfunktionen wie Wenden AVG, MAX, MIN, SUM, und COUNTauf bestimmte Spalte und holen Sie den Spaltennamen und Aggregationsfunktion Ergebnis in der gleichen Spalte.

Beispiel:

select  specialColumn,sum(specialColumn) from yourTableName group by specialColumn;

-1

Es gibt keinen signifikanten Unterschied zwischen Gruppierungsklausel und eindeutiger Klausel mit Ausnahme der Verwendung von Aggregatfunktionen. Beide können verwendet werden, um die Werte zu unterscheiden, aber wenn aus Sicht der Leistung die Gruppierung nach besser ist. Wenn ein bestimmtes Schlüsselwort verwendet wird, wird intern eine Sortieroperation verwendet, die im Ausführungsplan angezeigt werden kann.

Versuchen Sie es mit einem einfachen Beispiel

Deklarieren Sie die @ tmpresult-Tabelle (Id tinyint)

In @tmpresult einfügen Wählen Sie 5 Union all Select 2 Union all Select 3 Union all Select 4

Wählen Sie eine eindeutige ID aus @tmpresult


unterscheiden und gruppieren sich durch beide Willen
vignesh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.