Группировка sql результата по определенным критериям - PullRequest
0 голосов
/ 21 июня 2019

Я пишу запрос, который должен показывать для группы пользователей, какие письма он / она получил, и было ли письмо открытым или нет.

Это результат запроса:

Product     |   Year    |   Month   |   SendTime    |   UserId      |   EmailTitle      |   Open
That one    |   2018    |   11      |   2018-11-23  |   1000756     |   JoinUs          |   1   
That one    |   2018    |   11      |   2018-11-25  |   1000756     |   JoinUs          |   0   
That one    |   2019    |   1       |   2019-01-04  |   1000756     |   Need Help?      |   0   
That one    |   2019    |   4       |   2019-04-07  |   1000756     |   Win Back        |   0   
That one    |   2019    |   4       |   2019-04-10  |   1000756     |   A gift to you   |   0   

У меня проблема в том, что пользователь может получать одно и то же письмо чаще, чем раз в месяц, и открывать только один из них.Одним из примеров является EmailTitle JoinUs, который был получен в 23 и 25 дни, но было открыто только письмо 23и мне нужно показать только тот, который был открыт, желательно.

SELECT  S.Product, 
        YEAR(S.SendTime) [Year],
        MONTH(S.SendTime) [Month],
        S.SendTime SendTime, 
        S.UserId,
        M.EmailName,
        CASE WHEN Mo.ContactID IS NOT NULL THEN 1 ELSE 0 END [Open]
FROM MailSend S
JOIN CommMapping2 M on M.EmailName = S.EmailName
LEFT JOIN MailOpen Mo ON Mo.JobId = S.JobId AND Mo.BatchID = S.BatchID AND Mo.ContactID = S.ContactID 
WHERE S.UserId IS NOT NULL AND S.UserId = '1000756'

1 Ответ

1 голос
/ 21 июня 2019

Вы можете использовать rownumber и сделать partition с userid и EmailTitle.Таким образом, в случае двух электронных писем вы получите только открытое.

with cte as (
SELECT  S.Product, 
        YEAR(S.SendTime) [Year],
        MONTH(S.SendTime) [Month],
        S.SendTime SendTime, 
        S.UserId,
        M.EmailName,
        CASE WHEN Mo.ContactID IS NOT NULL THEN 1 ELSE 0 END [Open],
        ROW_NUMBER() over (partition by UserId,  EmailTitle order by  CASE WHEN Mo.ContactID IS NOT NULL THEN 1 ELSE 0 END desc) as number 
FROM MailSend S
JOIN CommMapping2 M on M.EmailName = S.EmailName
LEFT JOIN MailOpen Mo ON Mo.JobId = S.JobId AND Mo.BatchID = S.BatchID AND Mo.ContactID = S.ContactID 
WHERE S.UserId IS NOT NULL AND S.UserId = '1000756'
)
select *
from cte 
where number = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...