唯一单击次数(SQL查询)

唯一单击次数(SQL查询),sql,postgresql,group-by,count,distinct,Sql,Postgresql,Group By,Count,Distinct,我的服务中有一个电子邮件发送系统(针对我的电子邮件订户)。我需要获得有关发送邮件、点击次数和电子邮件打开次数的统计信息。所有信息存储在PostgreSQL数据库中 我有一个包含订户列表的表(subscriber\u collections): 因此,我有一个表,用于存储每个订户列表的电子邮件(电子邮件,一对多关系) 此外,我还有一个表mail\u activities,其中存储了有关不同电子邮件活动(如单击、打开、发送等)的信息: 请注意,用户可以重复单击(或打开)同一封电子邮件,信息将保存在数

我的服务中有一个电子邮件发送系统(针对我的电子邮件订户)。我需要获得有关发送邮件、点击次数和电子邮件打开次数的统计信息。所有信息存储在PostgreSQL数据库中

我有一个包含订户列表的表(
subscriber\u collections
):

因此,我有一个表,用于存储每个订户列表的电子邮件(
电子邮件
,一对多关系)

此外,我还有一个表
mail\u activities
,其中存储了有关不同电子邮件活动(如单击、打开、发送等)的信息:

请注意,用户可以重复单击(或打开)同一封电子邮件,信息将保存在数据库中

我有一个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
这个查询工作正常。以下是此数据的结果:

问题:我需要获得每个
电子邮件地址的独特点击次数并打开活动。我需要在该查询中以附加列的形式获取此信息(
unique\u单击
,然后
unique\u打开
)。例如,两次点击字母
Hello msg按用户
jay10@email.com
表中的电子邮件应视为一封。如何在其他列中获取此信息?谢谢


p.S:对不起,我的英语不好……

如果我理解正确,您可以使用条件计数(不重复)

不过,我不太确定这是否适合您现有的查询。您希望每封电子邮件具有唯一的计数(从描述中可以看出),但您是通过
message\u 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
_id  message_id  message_subject  activity_date   email_address       type
============================================================================
 1      25           Hello msg!    2017-11-21   john.smith@email.com  Sends
 2      25           Hello msg!    2017-11-21   john.smith@email.com  Opens
 3      25           Hello msg!    2017-11-21   john.smith@email.com  Clicks
 4      25           Hello msg!    2017-11-21   jay10@email.com       Clicks
 5      25           Hello msg!    2017-11-21   jay10@email.com       Clicks
 6      16           Discount!     2017-11-21   second@email.com      Opens
 7      16           Discount!     2017-11-21   second@email.com      Opens
 8      16           Discount!     2017-11-21   james3@email.com      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
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
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