У меня есть следующая таблица:
ID (int)
EMAIL (varchar(50))
CAMPAIGNID (int)
isSubscribe (bit)
isActionByUser (bit)
В этой таблице хранятся все действия по подписке и отмене подписки для кампаний для пользователя.Эти действия могут быть выполнены самим пользователем (isActionByUser = true) или администрацией (isActionByUser = false).
Мне нужно получить последнее действие, чтобы определить, подписан ли пользователь или отписан от него.Но помните, что когда пользователь выполнил действие по отмене подписки в кампании, он будет иметь приоритет над другими действиями по подписке со стороны администрации.
Я нашел хорошее решение , чтобы получитьпоследние записи сгруппированы по EMAIL и CAMPAIGNID.Но я не могу понять, как я включаю требование, что isActionByUser = true, имеет абсолютный приоритет над записями с isActionByUser = false.Также: когда администрация выполняет действие по отмене подписки, она будет иметь приоритет над записью с (isSubscribe = true и isActionByUser).
Пример данных:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
1 a@aa.com 1 1 0
2 b@bb.com 1 1 0
3 c@cc.com 1 1 0
4 a@aa.com 1 0 1
5 a@aa.com 1 1 0
6 c@cc.com 1 1 1
7 c@cc.com 1 0 0
Ожидаемый результат будет:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
2 b@bb.com 1 1 0
4 a@aa.com 1 0 1
7 c@cc.com 1 0 0
С помощью следующего запроса
select cs1.*
from
[TABLE] cs1
left join
[TABLE] cs2
on
cs1.EM_EMAIL = cs2.EM_EMAIL
and
cs1.EM_CAMPAIGNID = cs2.EM_CAMPAIGNID
and
cs1.id < cs2.id
where cs2.id is null
У меня следующий результат:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
2 b@bb.com 1 1 0
5 a@aa.com 1 1 0
7 c@cc.com 1 0 0
Другой подход:
SELECT *
FROM [TABLE] cs
WHERE id in
(
SELECT top 1 id
FROM [TABLE] ss
WHERE
cs.EMAIL = ss.EMAIL
and
cs.CAMPAIGNID = ss.CAMPAIGNID
and ISSUBSCRIBE = (
select top 1 min(convert(int, ISSUBSCRIBE))
FROM [TABLE] sss
WHERE
cs.EMAIL = sss.EMAIL
and
cs.CAMPAIGNID = sss.CAMPAIGNID
)
and ISACTIONBYUSER= (
select top 1 max(convert(int, ISACTIONBYUSER))
FROM [TABLE] ssss
WHERE
cs.EMAIL = ssss.EMAIL
and
cs.CAMPAIGNID = ssss.CAMPAIGNID
)
)
Это приведет к следующему результату:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
2 b@bb.com 1 1 0
4 a@aa.com 1 0 1
6 c@cc.com 1 1 1
Что также неверно.И я боюсь, что производительность будет большой проблемой при таком подходе.
Так есть какие-нибудь идеи, как я могу решить это?