如果触发器没有问题,这个未经测试的 Select-Statement 可能是您的解决方案。
第一个问题:
每次插入 mytable 后都会触发触发器。
在第一次插入时间戳之后,只有一个值。所以你需要在第三或第四条记录之后更新。
您为最后一个而不是当前时间戳进行插入。我的解决方案没有解决这个问题。
第二个问题:
您需要确保只插入一次,而不是在每一行之后插入。
您可以在插入的 select 语句中添加 NOT IN 子句。
我的解决方案没有解决这个问题。
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