Sie können dies wie folgt:
WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL
SELECT 1 ID, 'b' val FROM dual UNION ALL
SELECT 1 ID, 'c' val FROM dual UNION ALL
SELECT 2 ID, 'd' val FROM dual UNION ALL
SELECT 2 ID, 'e' val FROM dual UNION ALL
SELECT 2 ID, 'f' val FROM dual UNION ALL
SELECT 2 ID, 'g' val FROM dual UNION ALL
SELECT 3 ID, 'h' val FROM dual UNION ALL
SELECT 3 ID, 'i' val FROM dual UNION ALL
SELECT 3 ID, 'h' val FROM dual UNION ALL
SELECT 3 ID, 'j' val FROM dual UNION ALL
SELECT 3 ID, 'k' val FROM dual UNION ALL
SELECT 4 ID, 'l' val FROM dual UNION ALL
SELECT 4 ID, 'm' val FROM dual UNION ALL
SELECT 5 ID, 'n' val FROM dual)
SELECT ID,
listagg(CASE WHEN rn <= 3 THEN val ELSE '...' END, ',') WITHIN GROUP (ORDER BY val) vals
FROM (SELECT ID,
val,
row_number() OVER (PARTITION BY ID ORDER BY val) rn
FROM sample_data)
WHERE rn <= 4 -- max amount of expected elements + 1
GROUP BY ID;
ID VALS
--- -----------
1 a,b,c
2 d,e,f,...
3 h,h,i,...
4 l,m
5 n
In meinem Beispiel möchte ich nur drei Elemente angezeigt werden, zusammen mit „...“, wenn es weitere Elemente. Zunächst filtern wir die Ergebnisse für jede ID in nur die ersten vier Zeilen.
Um dies zu tun, habe ich die analytische Funktion ROW_NUMBER verwendet, um jede Zeile mit einer Zahl in aufsteigender Reihenfolge für jede ID zu beschriften.
Sobald wir die Zeilennummern kennen, können wir die Zeilen filtern, um die erwartete Anzahl von Elementen + 1 zurückzugeben - wir brauchen die zusätzliche Zeile, um zu wissen, ob mehr Zeilen verfügbar sind oder nicht. In meinem Fall bedeutet das, dass wir die ersten 4 Reihen bekommen müssen.
Als nächstes benötigen wir eine case-Anweisung, um den tatsächlichen Wert für die ersten drei Elemente und "..." für das vierte Element, falls vorhanden, auszugeben.
Dann können wir das in die LISTAGG integrieren und voila!
Natürlich nimmt die oben, dass die Datenbank nicht in der Version 12.2 ist - wenn ja, dann können Sie die Vorteile der neuen Überlauf Erweiterungen nehmen - siehe here for more information
Da Oracle 12.2 Sie die verwenden können, Überlauf-Klausel. http://modern-sql.com/feature/listagg#syntax Es funktioniert basierend auf der Länge der Ergebniszeichenfolge, nicht auf der Anzahl der aggregierten Elemente. –