2016-06-21 2 views
0

ID、トランザクション、それらのトランザクションの日付、およびそれらのトランザクションのカテゴリがあります。私は、各ID内の各個別のカテゴリの数を作成したい個数とウィンドウ関数をカウント

私が持って出発テーブルは次のようなものになりますされています

id trxn_dt  trxn_amt trxn_category 
1 10/31/2014 58  apple 
1 11/9/2014 34  banana 
1 12/10/2014 12  apple 
2 7/8/2014 78  banana 
2 11/20/2014 99  banana 
3 1/5/2014 120  orange 
4 2/17/2014 588  apple 
4 2/18/2014 8  banana 
4 3/9/2014 65  orange 
4 4/25/2014 74  apple 

をそして、私は最終的な結果は次のようなものを見てみたい:

id trxn_dt  trxn_amt trxn_category number_category 
1 10/31/2014 58  apple   2 
1 11/9/2014 34  banana   2 
1 12/10/2014 12  apple   2 
2 7/8/2014 78  banana   1 
2 11/20/2014 99  banana   1 
3 1/5/2014 120  orange   1 
4 2/17/2014 588  apple   3 
4 2/18/2014 8  banana   3 
4 3/9/2014 65  orange   3 
4 4/25/2014 74  apple   3 

私はcount(distinct(trxn_category)) over(partition by id,trxn_category order by id) as number_categoryを使用してみましたが、私はあなたがこのために相関サブクエリを使用することができます「明確な」

+1

は何を***正確***エラーメッセージ?どのDBMSを使用していますか? (Postgres?Oracle?SQL Server?)。それに加えて、「区別」は**機能ではありません**。 –

答えて

0

の使用に関するエラーが表示されます。

SELECT id, trxn_dt, trxn_amt, trxn_category, 
     (SELECT COUNT(DISTINCT trxn_category) 
     FROM mytable AS t2 
     WHERE t2.id = t1.id) AS cnt 
FROM mytable AS t1 

Demo here

0
;WITH cteCounts AS (
    SELECT 
     id 
     ,COUNT(DISTINCT trxn_category) as CategoryCount 
    FROM 
     table 
    GROUP BY 
     id 
) 


SELECT 
    t.id 
    ,trxn_dt 
    ,trxn_amt 
    ,trxn_category 
    ,c.CategoryCount 
FROM 
    table t 
    INNER JOIN cteCounts c 
    ON t.id = c.id 

パーティションの集約でDISTINCTを使用することはできません。

0

ほとんどのDBMSは、ウィンドウ表示機能でDISTINCTはサポートされていませんが、次の2つのDENSE_RANKs使用してCOUNT(DISTINCT)をエミュレートすることができます

DENSE_RANK() over (partition by id,trxn_category order by id ASC)- 
DENSE_RANK() over (partition by id,trxn_category order by id DESC) 

またはネストされたMAX(DENSE_RANK):

select 
    MAX(dr) over (partition by id,trxn_category) 
from 
(
    select 
     DENSE_RANK() over (partition by id,trxn_category order by id DESC) as dr 
) 
関連する問題