将多个数据集排序为一个数据集

时间:2012-02-03 15:09:46

标签: sql sql-server-2008 sorting

我几天前问了同样的问题,但我想用一个单独的C#程序来解决我的问题。现在我想直接在SQL中完成它。

That's my problem (很抱歉将您与其他问题联系起来)

我的第一次尝试是创建此触发器:

CREATE TRIGGER myNewTrigger ON [dbo].[myTable]
FOR INSERT
AS

INSERT INTO dbo.myTargetTable
        (TIMESTAMP, VALUE_1, VALUE_2, VALUE_3, VALUE_4)
    SELECT
        DATEADD(SECOND, TIMESTAMP_S,'19700101'), VALUE, VALUE, VALUE, VALUE
        FROM inserted

GO

这将创建四行,每行具有相同的四个值。但是,如何将每行的值放在一行中的不同列?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果触发器没有问题,这个未经测试的Select-Statement可能是您的解决方案。

第一个问题:

每次在mytable上插入后都会触发触发器。 在第一次插入时间戳后,只有一个值。所以你需要在第三或第四条记录后更新。 您为最后一个而不是当前时间戳执行插入操作。我的解决方案没有解决这个问题。

第二个问题:

你需要做一个shure,你只需插入一次而不是每一行。 您可以在插入的select语句中添加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 

您的问题的Possibel解决方案,在评论中说明:

使用此未经测试的查询,您将最后一个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 

答案 1 :(得分:0)

有人可以让你更轻松... 凌乱而脆弱

基本上你需要

找出你的myTargetTable中是否有记录时间戳。 如果没有插入一个设置值1。 如果你这样做,你需要测试一个空闲插槽(值2到4)并更新。

如果你插入了ValueNumber,你可以做更强大的事情。

就个人而言,我很想对它进行规范化,并让MyTargetTable为TimeStamp,ValueNumber,Value,但如果你总是得到所有四个值,那么这会增加你的存储需求三个时间戳和四个整数。我只能说每次我看到一个包含Column1到ColumnN的表,就像有人需要将其标准化一样。 :(