私のサービスにはメール配信システムがあります(メール購読者向け)。私は、送信されたメッセージ、クリック数、および開封回数についての統計情報を自分のメールのために取得する必要があります。すべての情報は、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
このクエリは正常に動作します。
QUESTION:私はユニーククリックのカウントを取得する必要があり、各email_address
のための活動を開き、ここでは、このデータの結果です。このクエリで追加の列として取得する必要があるこの情報(unique_clicks
およびunique_opens
)。たとえば、Hello msg!
というユーザの[email protected]
という文字の2回のクリックは、表emails
で1つと認識されます。この情報を追加の列で入手するにはどうすればよいですか?おかげで...
PS:私の悪い英語のための申し訳ありません...