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