2016-05-03 9 views
0

標準のyyyy-mm-dd形式の列user_id,purchase_dateおよびdateの列を持つデータテーブルがあります。商品上のユーザーのための最初の観察

この表のユーザーは、同じ月に同じ製品(および異なる製品)を複数購入するので、最初に特定の製品を購入した後、月ごとに各製品をカウントする必要がありました。

私は次のようにそれをやった:

SELECT yr, mo, COUNT(DISTINCT(CASE WHEN Product = 'product_a' 
            THEN user_id)) AS product_a 
FROM 
( 
    SELECT YEAR(min(purchase_date)) AS yr, MONTH(min(pruchase_date)) AS mo, 
      DAY(min(purchase_date)) AS dy, user_id, Product 
    FROM daily_purchases 
    GROUP BY user_id, Product 
) b 
GROUP BY yr, mo 
ORDER BY yr, mo 

これは正常に動作し、私が探しています何をキャプチャしているようです。誰にも何か提案がありますか?これについてはこれが最も適切な方法ですか?ありがとう!

+0

そのMicrosoft SQL – windsormatic

+0

標準のyyyy-mm-dd形式の日付列はどういう意味ですか?それを文字列として保存していますか?それは標準ではありません。日付として保存する必要があります。 –

+0

商品を列に入れたいですか?購入した最小の日付の1つの列とその数の1つの列?それが正しい場合、これは動的ピボットのように思えます。 – fqhv

答えて

0

私はここでテストするための任意のソースデータを持っている...ませんが、私は、ソースデータでそれをテストしていないとして、私はそれに近づくだろうか...これはいくつかの調整が必要になる場合があります:

Select [yr], [mo], [user_id], [firstBuy], [cntBuys] From 
    (
     SELECT [yr], [mo], [user_id], 
      ROW_NUMBER() over (partition by user_id order by purchase_date) as 'firstBuy' 
      ,COUNT(*) over (partition by user_id, Product) as 'cntBuys' 
     FROM daily_purchases 
    ) a 
    Where a.firstBuy = 1 
    Group by a.yr, a.mo 
関連する問題