Как я упоминаю в комментариях, здесь что-то кажется "неправильным";как вам INSERT
строка на более позднюю дату, которая имеет "последнее" значение для Phone
, но каким-то образом имеет более старую версию для Email
?Это «пахнет» как любой процесс, который вы используете для INSERT
данных, имеет недостатокНа самом деле у вас должен быть один столбец для версии строки;дизайн, подобный этому, будет очень трудно поддерживать.
Это будет означать, что ваши данные могут выглядеть примерно так:
ID Email Phone Updated_Date
1 def@t.com 4151234567 2018-09-28
1 def@t.com 4150000000 2019-09-28
1 abc@t.com 4150000000 2019-09-28
Обратите внимание, что приведенное выше означает, что было 2 измененията же самая дата (одна возвращающая значение электронной почты);поэтому вам нужно добавить дополнительный столбец идентификатора версии (столбец IDENTITY
будет работать нормально) или , вам нужно будет указать время изменения, а также дату.Без добавления идентификатора версии или времени у вас нет возможности узнать, какая из последних 2 строк является «правильной» (поскольку вы не можете понять это с помощью ORDER BY
, а таблицы этого не делаютсохраняйте данные в «порядке, в котором они были вставлены»).
В любом случае, я бы использовал метод, подобный тому, который я ранее отмечал как дубликат (все еще используя ROW_NUMBER
), но с добавлением некоторой условной агрегации:
WITH CTE AS(
SELECT ID,
Email,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Email_Date DESC) AS Email_RN,
Phone,
ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Phone_Date DESC) AS Phone_RN
FROM YourTable)
SELECT ID,
MAX(CASE Email_RN WHEN 1 THEN Email END) AS Email,
MAX(CASE Phone_RN WHEN 1 THEN Phone END) AS Phone
FROM CTE
GROUP BY ID;