У меня есть следующая таблица:SQL: получить последнюю (ООН) subscribeaction из таблицы
ID (int)
EMAIL (varchar(50))
CAMPAIGNID (int)
isSubscribe (bit)
isActionByUser (bit)
Эта таблица хранит все подписываться и отписываться действия по кампании для пользователя. Эти действия могут выполняться самим пользователем (isActionByUser = true) или администратором (isActionByUser = false).
Мне нужно получить последнее действие, чтобы определить, подписан ли пользователь или отменили подписку. Но имея в виду, что когда пользователь выполнил действие отписки от кампании, он будет иметь приоритет для других действий подписки администратором.
Я нашел nice solution, чтобы получить самую последнюю запись, сгруппированную по EMAIL и CAMPAIGNID. Но я не могу понять, как я включаю требование, чтобы isActionByUser = true, имеет абсолютный приоритет над записями с isActionByUser = false. Кроме того: когда административный стол выполняет действие отмены подписки, он будет иметь приоритет над записью с помощью (isSubscribe = true и isActionByUser).
Пример данных:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
1 [email protected] 1 1 0
2 [email protected] 1 1 0
3 [email protected] 1 1 0
4 [email protected] 1 0 1
5 [email protected] 1 1 0
6 [email protected] 1 1 1
7 [email protected] 1 0 0
Ожидаемый результат будет:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
2 [email protected] 1 1 0
4 [email protected] 1 0 1
7 [email protected] 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
I»м, имеющий следующий результат:
ID EMAIL CAMPAIGNID ISSUBSCRIBE ISACTIONBYUSER
-----------------------------------------------------------
2 [email protected] 1 1 0
5 [email protected] 1 1 0
7 [email protected] 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 [email protected] 1 1 0
4 [email protected] 1 0 1
6 [email protected] 1 1 1
Что тоже не правильно. И я боюсь, что с этим подходом будет большой rpoblem.
Итак, любые идеи, как я могу это решить?
вам нужен идентификатор строки, где данные поступают от делать? –
Кроме того, когда «когда административный офис выполняет действие отписки, он будет иметь приоритет над записью с (isSubscribe = true и isActionByUser)», вы имеете в виду, что если администратор не отменил подписку на пользователя, этот пользователь не может подписаться? –
@TimLehner Мне нужны все данные. Планируйте, чтобы сделать вид, который я могу ссылаться в .NET Entity Framework. – JurgenStillaert