2017-11-20 8 views
0

私のサービスにはメール配信システムがあります(メール購読者向け)。私は、送信されたメッセージ、クリック数、および開封回数についての統計情報を自分のメールのために取得する必要があります。すべての情報は、PostgreSQLデータベースに保存されています。ユニーククリック数(SQLクエリ)

私は私の加入者リスト(subscriber_collections)を持つテーブルがある:

_id name 
=========== 
1 MySubscribers 
2 VIP Subscribers 

だから私は、各加入者のリストについては、電子メール(emails、1対多の関係)を格納するテーブルを持っている

_id subscriber_collection_id email_address 
=========================================== 
1    1    [email protected] 
2    1    [email protected] 
3    1    [email protected] 
4    2    [email protected] 
5    2    [email protected] 
6    2    [email protected] 

また、私はmail_activitiesさまざまな電子メール活動(クリックするなど、など、情報を格納しています)を送ります。:

_id message_id message_subject activity_date email_address  type 
============================================================================ 
1  25   Hello msg! 2017-11-21 [email protected] Sends 
2  25   Hello msg! 2017-11-21 [email protected] Opens 
3  25   Hello msg! 2017-11-21 [email protected] Clicks 
4  25   Hello msg! 2017-11-21 [email protected]  Clicks 
5  25   Hello msg! 2017-11-21 [email protected]  Clicks 
6  16   Discount!  2017-11-21 [email protected]  Opens 
7  16   Discount!  2017-11-21 [email protected]  Opens 
8  16   Discount!  2017-11-21 [email protected]  Opens 

ユーザーは、同じ電子メールを繰り返しクリック(または開く)することができ、情報はデータベースに保存されることに注意してください。

私は、各電子メールメッセージや加入者のコレクションのための様々な活動の数を取得するSQLクエリを、持っている:

SELECT 
    MA.message_id 
    ,MA.message_subject 
    ,SC.name as subscriber_collection_name 
    ,MA.date AS activity_date 
    ,SUM(CASE WHEN MA.type='Sends' THEN 1 ELSE 0 END) as sends_count 
    ,SUM(CASE WHEN MA.type='Opens' THEN 1 ELSE 0 END) as opens_count 
    ,SUM(CASE WHEN MA.type='Clicks' THEN 1 ELSE 0 END) as clicks_count 
FROM 
    mail_activities MA 
    INNER JOIN emails E ON MA.email_address = E.email_address 
    INNER JOIN subscriber_collections SC ON E.subscriber_collection_id = SC._id 

GROUP BY 
    MA.message_id 
    ,MA.message_subject 
    ,SC._id 
    ,SC.name 
    ,MA.date      
ORDER BY 
    message_id 

このクエリは正常に動作します。

result of SQL-query

QUESTION:私はユニーククリックのカウントを取得する必要があり、各email_addressのための活動を開き、ここでは、このデータの結果です。このクエリで追加の列として取得する必要があるこの情報(unique_clicksおよびunique_opens)。たとえば、Hello msg!というユーザの[email protected]という文字の2回のクリックは、表emailsで1つと認識されます。この情報を追加の列で入手するにはどうすればよいですか?おかげで...

PS:私の悪い英語のための申し訳ありません...

答えて

1

私が正しく理解していれば、あなたは条件付きcount(distinct)を使用することができます。

COUNT(DISTINCT CASE WHEN MA.type = 'Sends' THEN ma.message_id END) as sends_unique_count 
COUNT(DISTINCT CASE WHEN MA.type = 'Opens' THEN ma.message_id END) as opens_unique_count 
COUNT(DISTINCT CASE WHEN MA.type = 'Clicks' THEN ma.message_id END) as clicks_unique_count 

私はどのように非常にわからないんだけどこれはあなたの既存のクエリに適合します。メールごとにユニークな数が必要です(説明のようです)が、合計はmessage_idです。

Hmmm。 。 。別のメールアドレスが必要な場合があります。

COUNT(DISTINCT CASE WHEN MA.type = 'Sends' THEN ma.email_address END) as sends_unique_count 
COUNT(DISTINCT CASE WHEN MA.type = 'Opens' THEN ma.email_address END) as opens_unique_count 
COUNT(DISTINCT CASE WHEN MA.type = 'Clicks' THEN ma.email_address END) as clicks_unique_count