CONCAT(Spalte) OVER(PARTITION BY...)? Gruppe-concatentating Zeilen ohne Gruppierung das Ergebnis selbst
Ich brauche einen Weg, um eine Verkettung aller Zeilen (pro Gruppe) in einer Art Fenster-Funktion, wie Sie tun können COUNT(*) OVER(PARTITION BY...)
und der aggregierten Anzahl der Zeilen pro Gruppe wiederholt über jede einzelne Gruppe. Ich brauche etwas ähnlich, aber mit einer string-Verkettung alle Werte pro Gruppe wiederholt über jede Gruppe.
Hier finden Sie einige Beispiel-Daten und der von mir gewünschten Ergebnis besser zu veranschaulichen mein problem:
grp | val
------------
1 | a
1 | b
1 | c
1 | d
2 | x
2 | y
2 | z
Und hier ist, was ich brauche (das gewünschte Ergebnis):
grp | val | groupcnct
---------------------------------
1 | a | abcd
1 | b | abcd
1 | c | abcd
1 | d | abcd
2 | x | xyz
2 | y | xyz
2 | z | xyz
Hier ist der wirklich interessante Teil dieses Problems:
Meine Besondere situation, die mich daran hindert zu können, auf die gleiche Tabelle zweimal (ich bin tatsächlich tun dies in einem rekursiven Allgemeinen Tabellenausdruck, so kann ich das nicht eine self-join-Tabellenausdruck oder es wirft einen Fehler).
Ich bin mir voll bewusst, dass man so etwas machen kann:
SELECT a.*, b.groupcnct
FROM tbl a
CROSS APPLY (
SELECT STUFF((
SELECT '' + aa.val
FROM tbl aa
WHERE aa.grp = a.grp
FOR XML PATH('')
), 1, 0, '') AS groupcnct
) b
Aber wie Sie sehen können, dass die auf tbl
zwei mal in der Abfrage.
Kann ich nur Referenz tbl
einmal, also warum Frage ich mich, ob Teilbild-Gruppe-Verkettung ist möglich (ich bin ein bisschen neu TSQL, da komme ich aus einer MySQL-hintergrund, so dass nicht sicher, ob so etwas gemacht werden kann).
Tabelle Erstellen:
CREATE TABLE tbl
(grp int, val varchar(1));
INSERT INTO tbl
(grp, val)
VALUES
(1, 'a'),
(1, 'b'),
(1, 'c'),
(1, 'd'),
(2, 'x'),
(2, 'y'),
(2, 'z');
- Es ist eigentlich eine Folge, nicht eine Tabelle. Die Abfrage ist bereits getan wird, in einem rekursiven Allgemeinen Tabellenausdruck, so die Allgemeine Tabellenausdrücke verwenden, ist keine option. Der Grund, warum ich brauche dies, weil ich versuche zu verfolgen, Werte aus vorherigen Rekursion Schichten, wie ich recurse durch den Tisch mit einer CTE.
- Diese Frage macht nicht viel Sinn ohne die rekursive Abfrage. Sie können immer das Ergebnis der Abfrage in eine temporäre Tabelle und der Gruppe concat auf, dass.
- Unter Berufung auf die rekursive version, um zu zeigen, dass es nicht gut ist, das zu wählen, Vorgehensweise: stackoverflow.com/questions/11137075/..., Es ist besser
XML PATH
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchte ich mit reiner WAK-Ansatz: Was ist der beste Weg, um form-der string-Wert mit der Spalte von einer Tabelle mit Zeilen mit derselben ID? Denken, es ist schneller
Aber der benchmark sagt etwas anderes, es ist besser, verwenden Sie eine Unterabfrage(oder
CROSS APPLY
) Ergebnisse ausXML PATH
als Sie sind schneller: Was ist der beste Weg, um form-der string-Wert mit der Spalte von einer Tabelle mit Zeilen mit derselben ID?Ist es möglich, dass Sie nur Ihre Sachen in der select-statt oder Sie laufen in das gleiche Problem? (ich ersetzt 'tbl' mit 'TEMP.TEMP123')
Dieser arbeitete für mich-wollte sehen, ob das funktionierte auch für Sie.
In sql-2017 können Sie STRING_AGG Funktion:
STRING_AGG
Funktion dient.Ich weiß, dieser Beitrag ist alt, aber nur für den Fall, dass jemand noch Fragen haben, können Sie erstellen Skalare Funktion, die Zeile verkettet Werte.
Hier ist das Ergebnis-set habe ich aus der Abfrage eine Beispiel-Tabelle: