У меня есть набор таблиц, каждая из которых содержит связанные данные, и мне нужно выбрать самый последний набор записей для каждой строки в исходной таблице. Есть миллионы строк, и мне нужно сделать это эффективно, и пока я не могу вернуть только самую последнюю дату для данного числа.
Например, текущий результат для данного числа:
CampaignName MobileNumber Date
Campaign A 12345678910 12/02/2018 14:50:30
Campaign B 12345678910 05/02/2018 11:35:22
Должна быть возвращена только строка для кампании А.
По сути, я пытаюсь получить самое последнее сообщение, отправленное для каждого номера мобильного телефона, и данные кампании для этого сообщения (каждое сообщение является частью кампании.
SELECT CC.campaignname,
Co.mobilenumber,
Max(M.msgcreatetime)
FROM [Database].[dbo].[messages] M WITH(nolock)
INNER JOIN dbo.messagecontact MC WITH(nolock)
ON M.msgid = MC.messageid
INNER JOIN dbo.campaigncontact Co WITH(nolock)
ON Co.contactid = MC.contactid
INNER JOIN dbo.campaign CC WITH(nolock)
ON M.campaignid = CC.campaignid
GROUP BY CC.campaignname,
Co.mobilenumber
Нет таблицы с именем source.
хорошо, спасибо, я обновил сообщение @Mazhar
Используйте top 1 with ties
и order by row_number
:
Использование top 1 with ties
означает, что вы получите все записи, в которых значение порядка по выражению является самым низким.
Использование row_number() over(partition by Co.mobilenumber order by M.msgcreatetime desc)
вернет 1 для последней даты для каждого мобильного номера компании, 2 для второй от последней и т. д.
SELECT TOP 1 WITH TIES
CC.campaignname,
Co.mobilenumber,
M.msgcreatetime
FROM [Database].[dbo].[messages] M WITH(nolock)
INNER JOIN dbo.messagecontact MC WITH(nolock)
ON M.msgid = MC.messageid
INNER JOIN dbo.campaigncontact Co WITH(nolock)
ON Co.contactid = MC.contactid
INNER JOIN dbo.campaign CC WITH(nolock)
ON M.campaignid = CC.campaignid
ORDER BY ROW_NUMBER() OVER(PARTITION BY Co.mobilenumber ORDER BY M.msgcreatetime desc)
Вам необходимо предоставить дополнительную информацию. Что не так с этим запросом? Что значит борьба? Наконец, вы не должны использовать `with (nolock) brentozar.com/archive/2015/03/…