あなたはそうのようにこれを行うことができます:私の例では
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
を、私は利用可能な他の要素がある場合と、「...」に沿ってちょうど3つの要素が、表示したいです。最初に、各IDの最初の4行だけに結果をフィルタリングします。
これを行うには、ROW_NUMBER分析関数を使用して、各行の昇順のval順に番号を付けます。
行番号が分かれば、期待される要素数+1を返すように行をフィルタリングすることができます。余分な行があるかどうかを知るために必要です。私の場合は、最初の4行を取得する必要があるということです。
次に、最初の3つの要素の実際の値を出力するcase文と、存在する場合は4番目の要素の "..."が必要です。
次に、それをLISTAGGとVOILAに組み込むことができます。もちろん
、上記のデータベースがバージョン12.2ではないことを前提として - それはされている場合は、新しいオーバーフローの機能強化を活用することができます - Oracleの12.2以来here for more information
を参照してくださいあなたが使用することができます'overflow'節。 http://modern-sql.com/feature/listagg#syntax集約された要素の数ではなく、結果の文字列の長さに基づいて動作します。 –