Как я могу обновить пустые столбцы даты и времени с соответствующей датой, когда transmitted_profile_fk
соответствует? Не могли бы вы предоставить простой SQL-запрос для этой задачи?
См. скриншот структуры таблицы:
Обновить максимальную дату того же значения столбца? Упрощенная версия и возможное решение вашего варианта использования здесь: dbfiddle.uk/qwi_fQ6q Я не уверен, что это именно то, что вам нужно, потому что ваше описание расплывчато.
Небольшой поворот в ответе Джонаса dbfiddle.uk/2pAUV5f6
Пожалуйста, не используйте изображения для данных, используйте уценку таблицы.
Это должно сработать
Он получает все DateTimes, которые не являются null
, получает первый элемент и обновляет DateTime
, где transmitted_profile_fk
совпадает с тем, где DateTime
нет null
В конце он удаляет строку из нашей локальной переменной.
Это продолжается до тех пор, пока в локальной переменной есть строки.
Обратите внимание, что вам нужно вставить свой TABLE_NAME
declare @local TABLE(ID int, transmitted_profile_fk varchar(100), "DateTime" DateTime)
INSERT INTO @local select ID, transmitted_profile_fk, "DateTime" from { TABLE_NAME } where "DateTime" is not null
while (select count(ID) from @local) > 0
begin
declare @id int
declare @transmitted_profile_fk varchar(100)
declare @DateTime DateTime
select TOP 1 @id = ID, @transmitted_profile_fk = transmitted_profile_fk, @DateTime = "DateTime" from @local
update { TABLE_NAME } set "DateTime" = @DateTime where transmitted_profile_fk = @transmitted_profile_fk
delete from @local where ID = @id
end
Это наиболее неэффективный метод, который без необходимости использует временную таблицу и цикл while, тогда как всю операцию можно выполнить с помощью операции с набором.
;WITH CTE AS (
SELECT
*
, New_POST_TIME = ISNULL(POST_TIME, FIRST_VALUE(POST_TIME) OVER (PARTITION BY TRANSMITTED_PROFILE_FK ORDER BY POST_TIME DESC))
FROM @Example
ORDER BY ID
)
UPDATE CTE
SET POST_TIME = New_POST_TIME
Я изменил имя столбца «DateTime» на «Время публикации».
Хороший ответ содержит объяснение
См. пример.
Столбец Datetime будет обновлен в соответствии с результатом подзапроса.
Если результат подзапроса равен нулю, значение null будет обновлено на значение null.
update test
set datetime=(select max(datetime) from test t2
where t2.transmitted_profile_fk=test.transmitted_profile_fk)
where test.datetime is null;
С данными испытаний
2 rows affected
Другой пример
update test
set datetime=upd.dttm
from (select transmitted_profile_fk,max(datetime) dttm from test t2
group by transmitted_profile_fk
) upd
where test.transmitted_profile_fk=upd.transmitted_profile_fk
and test.datetime is null and upd.dttm is not null;
вывод
1 rows affected
Там ставим max(datetime) is not null
, чтобы избежать ненужных обновлений.
было бы неплохо, если бы вы предоставили примеры данных в формате расходных материалов