Как эффективно выбрать самую последнюю запись для набора значений TSQL? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть набор таблиц, каждая из которых содержит связанные данные, и мне нужно выбрать самый последний набор записей для каждой строки в исходной таблице. Есть миллионы строк, и мне нужно сделать это эффективно, и пока я не могу вернуть только самую последнюю дату для данного числа.

Например, текущий результат для данного числа:

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 

1 Ответ

0 голосов
/ 02 мая 2018

Использование 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...