Это непроверенное предложение выбора может быть вашим решением, если не будет проблемы с триггером.
Первая проблема:
Триггер срабатывает после каждой вставки в mytable.После первой вставки метки времени остается только одно значение.Так что нужно обновлять после третьей или четвертой записи.Вы делаете вставку для последней, а не для текущей отметки времени.Эта проблема не решена в моем решении.
Вторая проблема:
Вы должны убедиться, что вы вставляете только один раз, а не после каждой строки.Вы можете добавить NOT IN-Clause в оператор выбора для вставки.Эта проблема не решена в моем решении.
SELECT
DISTINCT
TS
,(SELECT VALUE FROM
(SELECT MT.TS, MT.VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable MT
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 1) AS VALUE1
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 2) AS VALUE2
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 3) AS VALUE3
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 4) AS VALUE4
FROM inserted
GROUP BY TS
Возможное решение вашей проблемы, указанное в комментарии:
С помощью этого непроверенного запроса вы вставляете последний, а не текущий TSв целевой таблице.Таким образом, вы гарантируете, что просто обновляете, когда пишется последняя запись TS, поэтому перед вставкой у вас есть все записанные значения (1..4).
Это может быть медленно: -).Но я не знаю лучшего способа.
SELECT
DISTINCT TOP 1
TS
,(SELECT VALUE FROM
(SELECT MT.TS, MT.VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable MT
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 1) AS VALUE1
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 2) AS VALUE2
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 3) AS VALUE3
,(SELECT VALUE FROM
(SELECT TS, VALUE ,ROW_NUMBER () OVER (ORDER BY TS, VALUE) AS ROWNUMBER
FROM myTable
WHERE MT.TS = TS) DATASET
WHERE DATASET.ROWNUMBER = 4) AS VALUE4
FROM myTable
WHERE TS < (SELECT MIN(TS) FROM INSERTED)
AND TS NOT IN (SELECT TS FROM MyTargetTable)
GROUP BY TS