2017-05-30 18 views
1

LISTAGGを使用して最初の3行を1つの列にグループ化するSQLクエリで、自分の列のいずれかを制限しようとしています。OracleでのLISTAGG結果の制限

例えば

Table 
----- 
Name Orders 
--------------- 
Joe Joe_Order1 
Joe Joe_Order2 
Joe Joe_Order3 
Joe Joe_Order4 
Joe Joe_Order5 
Joe Joe_Order6 
Mark Mark_Order1 
Mark Mark_Order2 
Mark Mark_Order3 
Mark Mark_Order4 

が、それは次のように返している...私はしかしLISTAGGを使用してデータを連結することができるよ

Name Recent_Orders 
----------------------------- 
Joe Joe_Order1, Joe_Order2, Joe_Order3 
Mark Mark_Order1, Mark_Order2, Mark_Order3 

、私は制限するかどうかは全くわからないんだけど結果は最初の3レコードになります。

これはLISTAGGで可能ですか?どんな助けでも大歓迎です。 LISTAGG()NULL値を無視し、デフォルトでは

SELECT NAME, 
     LISTAGG(CASE WHEN seqnum <= 3 THEN Orders END, ', ') WITHIN GROUP (ORDER BY Orders) as Recent_Orders 
FROM (SELECT o.*, ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY ?? DESC) as seqnum 
     FROM Order_table o 
    ) o 
GROUP BY NAME; 

、これは何をしたいん:ありがとう

答えて

1

あなたが行を列挙し、caseを使用してこれを行うことができます。

??は、順序を指定する列です。 SQLテーブルは、を表しています。セットはありません。列が順序を指定しない限り、「最初の3つ」または「最後の3つ」はありません。

1

WHERE句

with CTE as 
(
select row_number() over(partition by NAME order by Orders) as rn, 
     a1.* 
from Order_Table a1 
) 
SELECT NAME, LISTAGG(Orders, ', ') within group(order by Orders) 
    as Recent_Orders 
FROM 
    CTE 
WHERE 
    rn <=3 
GROUP BY 
    NAME 
に制限を適用し、その後、CTEでROW_NUMBERを適用します。