Warum sollte dies eine bedeutungslose Frage sein? Scheint etwas zu sein, das jeder Anfänger-SQL-Programmierer fragen könnte.
Womp
Antworten:
53
Das DISTINCT-Schlüsselwort
Ich glaube, was Sie versuchen zu tun, ist:
SELECTDISTINCT * FROM MyFooTable;
Wenn Sie nach allen Spalten gruppieren, fordern Sie lediglich die Entfernung doppelter Daten an.
Zum Beispiel eine Tabelle mit folgenden Daten:
id | value
----+----------------
1 | foo
2 | bar
1 | foo
3 | something else
Wenn Sie die folgende Abfrage ausführen, die im Wesentlichen mit der SELECT * FROM MyFooTable GROUP BY *Annahme identisch ist, dass * alle Spalten bedeutet:
SELECT * FROM MyFooTable GROUP BY id, value;
id | value
----+----------------
1 | foo
3 | something else
2 | bar
Es werden alle doppelten Werte entfernt, was es im Wesentlichen semantisch identisch mit der Verwendung des Schlüsselworts DISTINCT macht, mit Ausnahme der Reihenfolge der Ergebnisse. Zum Beispiel:
SELECT DISTINCT * FROM MyFooTable;
id | value
----+----------------
1 | foo
2 | bar
3 | something else
Ich denke das ist nicht richtig. Wenn Sie row_number () für etwas verwenden, zählt die eindeutige Anzahl mehr. Wenn ich einen x_code habe, der zwei y_code per join hat, bringt mir das "different" 2 Zeilen und zählt zweimal über row_number (), aber wenn ich group by verwende, bringt mir korrekt nur eine. Ich mache es durch! Ich benötige eine sequenzielle Ganzzahlregistrierung und "eindeutige" Zählungen zählen mich zweimal auf x_code.
Natan Medeiros
Dies vermisst einige wichtige Fälle wie UDAFs
StephenBoesch
1
Die Verwendung von DISTINCT ist nicht immer direkt möglich. Wenn eine Abfrage die ORDER BY-Klausel enthält, wird möglicherweise die folgende Fehlermeldung angezeigt: 'FEHLER: Für SELECT DISTINCT müssen ORDER BY-Ausdrücke in der Auswahlliste angezeigt werden.' Die einzige Lösung in dieser Situation ist eine verschachtelte Abfrage AFAIK.
Prograils
15
Er versucht, die doppelten Zeilen in einer Tabelle zu finden und anzuzeigen.
SELECT *, COUNT(*) AS NoOfOccurrences
FROM TableName GROUPBY *
HAVINGCOUNT(*) > 1
Ich weiß nicht, wie das funktioniert, aber es ist brillant und genau das, was ich brauchte. Ist dieser Trick irgendwo dokumentiert und wird er von allen wichtigen relationalen DBs unterstützt?
kosmičák
3
Nein, da dies im Grunde bedeutet, dass Sie nichts gruppieren. Wenn Sie nach allen Spalten gruppieren (und eine ordnungsgemäß definierte Tabelle mit einem eindeutigen Index haben), SELECT * FROM tableist dies im Wesentlichen dasselbe wie SELECT * FROM table GROUP BY *.
Wenn Sie keinen eindeutigen Index haben, ist die Tabelle SELECT * FROM natürlich nicht mit der Tabelle SELECT * FROM GROUP BY * identisch. In diesem Fall können Sie dies mit der Tabelle SELECT DISTINCT * FROM erreichen.
Sören Kuklau
7
Doppelte Zeilen sind eine häufige Sache, mit der Sie sich befassen müssen, wenn Sie Projekte erben. Ich glaube daher nicht, dass man davon ausgehen kann, dass jemand niemals doppelte Zeilen entfernen möchte.
Elijah
6
Es gibt noch einen anderen Fall ... SELECT t1. *, Count (t2.items) FROM t1 LEFT JOIN t2 ON t1.id = t2.id GROUP BY t1. *
Danny Dulai
2
Kurze Antwort: nein. GROUP BY-Klauseln erfordern an sich eine Reihenfolge, in der sie Ihre Ergebnisse ordnen. Eine andere Reihenfolge der Feldgruppierungen würde zu unterschiedlichen Ergebnissen führen.
Die Angabe eines Platzhalters würde die Anweisung für Interpretationen und unvorhersehbares Verhalten offen lassen.
"offen für Interpretationen" Dies lässt sich leicht beheben, indem die natürliche Reihenfolge der Spalten angegeben wird - dh die Reihenfolge, in der sie definiert sind. Eine Platzhalter-Syntax wäre eine nützliche Funktion.
StephenBoesch
-1
Hier ist mein Vorschlag:
DECLARE @FIELDSVARCHAR(MAX), @NUMINT--DROP TABLE #FIELD_LISTSET @NUM = 1SET @FIELDS = ''SELECT'SEQ' = IDENTITY(int,1,1) ,
COLUMN_NAME
INTO#FIELD_LISTFROM Req.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'new340B'WHILE @NUM <= (SELECTCOUNT(*) FROM#FIELD_LIST)BEGINSET @FIELDS = @FIELDS + ',' + (SELECT COLUMN_NAME FROM#FIELD_LIST WHERE SEQ = @NUM)SET @NUM = @NUM + 1ENDSET @FIELDS = RIGHT(@FIELDS,LEN(@FIELDS)-1)
EXEC('SELECT ' + @FIELDS + ', COUNT(*) AS QTY FROM [Req].[dbo].[new340B] GROUP BY ' + @FIELDS + ' HAVING COUNT(*) > 1 ')
Antworten:
Das DISTINCT-Schlüsselwort
Ich glaube, was Sie versuchen zu tun, ist:
SELECT DISTINCT * FROM MyFooTable;
Wenn Sie nach allen Spalten gruppieren, fordern Sie lediglich die Entfernung doppelter Daten an.
Zum Beispiel eine Tabelle mit folgenden Daten:
id | value ----+---------------- 1 | foo 2 | bar 1 | foo 3 | something else
Wenn Sie die folgende Abfrage ausführen, die im Wesentlichen mit der
SELECT * FROM MyFooTable GROUP BY *
Annahme identisch ist, dass * alle Spalten bedeutet:SELECT * FROM MyFooTable GROUP BY id, value;
id | value ----+---------------- 1 | foo 3 | something else 2 | bar
Es werden alle doppelten Werte entfernt, was es im Wesentlichen semantisch identisch mit der Verwendung des Schlüsselworts DISTINCT macht, mit Ausnahme der Reihenfolge der Ergebnisse. Zum Beispiel:
SELECT DISTINCT * FROM MyFooTable;
id | value ----+---------------- 1 | foo 2 | bar 3 | something else
quelle
Er versucht, die doppelten Zeilen in einer Tabelle zu finden und anzuzeigen.
SELECT *, COUNT(*) AS NoOfOccurrences FROM TableName GROUP BY * HAVING COUNT(*) > 1
Haben wir einen einfachen Weg, dies zu erreichen?
quelle
Wenn Sie SqlServer verwenden, sollte das eindeutige Schlüsselwort für Sie funktionieren. (Nicht sicher über andere Datenbanken)
declare @t table (a int , b int) insert into @t (a,b) select 1, 1 insert into @t (a,b) select 1, 2 insert into @t (a,b) select 1, 1 select distinct * from @t
führt zu
quelle
Nee. Versuchen Sie eine Aggregation durchzuführen? Wenn ja, könnten Sie so etwas tun, um das zu bekommen, was Sie brauchen
;with a as ( select sum(IntField) as Total from Table group by CharField ) select *, a.Total from Table t inner join a on t.Field=a.Field
quelle
Ich wollte über die gesamte Ergebnismenge zählen und summieren. Ich habe eine Gruppierung von allen mit erreicht
GROUP BY 1=1
.quelle
Nein, da dies im Grunde bedeutet, dass Sie nichts gruppieren. Wenn Sie nach allen Spalten gruppieren (und eine ordnungsgemäß definierte Tabelle mit einem eindeutigen Index haben),
SELECT * FROM table
ist dies im Wesentlichen dasselbe wieSELECT * FROM table GROUP BY *
.quelle
Kurze Antwort: nein. GROUP BY-Klauseln erfordern an sich eine Reihenfolge, in der sie Ihre Ergebnisse ordnen. Eine andere Reihenfolge der Feldgruppierungen würde zu unterschiedlichen Ergebnissen führen.
Die Angabe eines Platzhalters würde die Anweisung für Interpretationen und unvorhersehbares Verhalten offen lassen.
quelle
Hier ist mein Vorschlag:
DECLARE @FIELDS VARCHAR(MAX), @NUM INT --DROP TABLE #FIELD_LIST SET @NUM = 1 SET @FIELDS = '' SELECT 'SEQ' = IDENTITY(int,1,1) , COLUMN_NAME INTO #FIELD_LIST FROM Req.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = N'new340B' WHILE @NUM <= (SELECT COUNT(*) FROM #FIELD_LIST) BEGIN SET @FIELDS = @FIELDS + ',' + (SELECT COLUMN_NAME FROM #FIELD_LIST WHERE SEQ = @NUM) SET @NUM = @NUM + 1 END SET @FIELDS = RIGHT(@FIELDS,LEN(@FIELDS)-1) EXEC('SELECT ' + @FIELDS + ', COUNT(*) AS QTY FROM [Req].[dbo].[new340B] GROUP BY ' + @FIELDS + ' HAVING COUNT(*) > 1 ')
quelle
Sie können Group by All verwenden, aber seien Sie vorsichtig, da Group by All aus zukünftigen Versionen von SQL Server entfernt wird.
quelle