Обновить таблицу данными от себя

Как я могу обновить пустые столбцы даты и времени с соответствующей датой, когда transmitted_profile_fk соответствует? Не могли бы вы предоставить простой SQL-запрос для этой задачи?

См. скриншот структуры таблицы:

Обновить таблицу данными от себя

было бы неплохо, если бы вы предоставили примеры данных в формате расходных материалов

Sergey 12.04.2024 21:05

Обновить максимальную дату того же значения столбца? Упрощенная версия и возможное решение вашего варианта использования здесь: dbfiddle.uk/qwi_fQ6q Я не уверен, что это именно то, что вам нужно, потому что ваше описание расплывчато.

Jonas Metzler 12.04.2024 21:09

Небольшой поворот в ответе Джонаса dbfiddle.uk/2pAUV5f6

John Cappelletti 12.04.2024 21:58

Пожалуйста, не используйте изображения для данных, используйте уценку таблицы.

Dale K 12.04.2024 22:16
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
88
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это должно сработать

Он получает все 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, тогда как всю операцию можно выполнить с помощью операции с набором.

T N 13.04.2024 16:37
;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» на «Время публикации».

Хороший ответ содержит объяснение

Dale K 13.04.2024 03:31
Ответ принят как подходящий

См. пример.
Столбец 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;

С данными испытаний

идентификатор переданный_профиль_fk дата и время 1 617c1fee-1bf1-441b-a3c9-51c592edce46 2024-04-12 22:43:45.913 2 617c1fee-1bf1-441b-a3c9-51c592edce46 нулевой 3 ff2c9ff2-72ac-484e-9bfb-7e4ef298cd72 2024-04-12 22:44:24.883 4 527d9571-1b80-4ccb-bb1f-c2de4cb20a5a нулевой
2 rows affected
идентификатор переданный_профиль_fk дата и время 1 617c1fee-1bf1-441b-a3c9-51c592edce46 2024-04-12 22:43:45.913 2 617c1fee-1bf1-441b-a3c9-51c592edce46 2024-04-12 22:43:45.913 3 ff2c9ff2-72ac-484e-9bfb-7e4ef298cd72 2024-04-12 22:44:24.883 4 527d9571-1b80-4ccb-bb1f-c2de4cb20a5a нулевой

Другой пример

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, чтобы избежать ненужных обновлений.

Другие вопросы по теме