2017-11-20 9 views
0

내 이메일 수신자에게 내 이메일 전달 시스템이 있습니다. 내 이메일의 보낸 메시지, 클릭 및 시작 횟수에 대한 통계 정보를 가져와야합니다. 모든 정보 저장소는 PostgreSQL 데이터베이스에 있습니다.고유 한 클릭 수 (SQL 쿼리)

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

그래서이 각 가입자 목록을 위해 이메일을 저장하는 테이블 (emails, 일대 다 관계)

_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] 
:

내 가입자 목록 (subscriber_collections)와 테이블이

나는 또한 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 

사용자는 동일한 전자 메일을 반복적으로 클릭 (또는 열 수) 있으며 정보는 데이터베이스에 있습니다.

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 

이 쿼리는 잘 작동 :

나는 각 이메일 메시지와 가입자 컬렉션에 대해 서로 다른 활동의 수를 가져 오는 SQL 쿼리를 보유하고 있습니다.

result of SQL-query

질문 : 나는 독특한 클릭 수를 얻을 필요가 각 email_address을위한 활동을 열고 다음은이 데이터에 대한 결과입니다. 해당 쿼리에서 추가 열로 가져와야하는이 정보 (unique_clicksunique_opens). 예를 들어, 사용자 [email protected]에 의해 Hello msg! 문자의 두 번의 클릭이 테이블 emails에 인식되어야합니다. 이 정보를 다른 열에서 어떻게 얻을 수 있습니까? 감사합니다 ...

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으로 집계됩니다.

흠. . . 아마도 뚜렷한 이메일 주소를 원할 것입니다 :

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