В MS SQL 2005 и выше вы можете увеличить таблицу и выбрать ее следующим образом:
SELECT placement_id, update_time, anything_else
FROM (
SELECT m.*, ROW_NUMBER() OVER (PARTITION BY placement_id ORDER BY update_time) AS rn
FROM mytable m
) mo
WHERE rn = 1
Это наиболее эффективно, так как при этом будет использоваться сканирование индекса, без соединений и триггеров.
Конечно, если вы используете MS SQL 2008
и не хотите хранить историю, вы можете добавить свои данные так:
MERGE
INTO mytable
USING VALUES(@new_id, @new_time, @new_data)
ON placement_id = @new_id
WHEN MATCHED THEN
UPDATE
SET update_time = @new_time,
anything_else = @new_data
WHEN NOT MATCHED THEN
INSERT (placement_id, update_time, anything_else)
VALUES(@new_id, @new_time, @new_data)
Это вставит место размещения, если его еще нет, обновит его, если оно есть - и все еще не будет ошибок.