表连接和排序

时间:2017-08-03 07:34:47

标签: sql sql-server sorting join

我有一个SQL表,用于存储从自动化过程记录的过程数据。该表存储变量名称,记录值,时间戳。该表如下所示:

VariableName | VariableValue | Timestamp
------------------------------------------
   Tag_1     |       1       |   Time_1  
   Tag_1     |       5       |   Time_2  
   Tag_1     |       4       |   Time_5  
   Tag_1     |       8       |   Time_7   
   Tag_2     |       3       |   Time_1  
   Tag_2     |       4       |   Time_3  
   Tag_2     |       5       |   Time_6  
   Tag_2     |       7       |   Time_7  
    ...

记录变量的值"在变化",因此它们出现在具有不同时间戳的表中。

为了能够导出数据并将其用于进一步处理,我们需要对表格进行排序并以不同的形式表示,即:

Timestamp | Tag_1 | Tag_2
--------------------------
  Time_1  |   1   |   3  
  Time_2  |   5   |   -  
  Time_3  |   -   |   4  
  Time_5  |   4   |   -  
  Time_6  |   -   |   5  
  Time_7  |   8   |   7    

正如你所看到的,有一些"盲点"在表示变量值的表中,这对应于仅在此时没有记录标记值的事实,即标记值相对于先前记录的值没有变化。

如何使用SQL实现此目的?我很可能需要一个具有上述结构的新表。但是,它需要动态创建,因为列数取决于记录的变量数(Tag_1,Tag_2等)。

创建表并查询数据库不是问题,因为我为此目的使用VB脚本。但是,我不知道如何制定查询(连接???)来实现该结构...

3 个答案:

答案 0 :(得分:3)

Yo可以使用此pivot查询:

TimeStamp | Tag_1 | Tag_2
----------+-------+-------
  Time_1  |   1   |   3
  Time_2  |   5   | (null)
  Time_3  |(null) |   4
  Time_5  |   4   | (null)
  Time_6  |(null) |   5
  Time_7  |   8   |   7

看到它在rextester.com上运行。输出:

//Javascript 
window.onload = function() {
    document.getElementById("sidebar").style.visibility = "hidden";
}; 

您不能直接使用动态列列表来执行此操作,但在编程环境中(或在带有execute的TSQL中),您可以动态构建此查询。

答案 1 :(得分:1)

dynamic sqlpivot一起使用。

首先计算列名的@Columns变量。

LogTable用于获取标签名称。但是如果你有一个带有已知标签的参考表,那么最好将它建立在那个参考表上。由于日志表往往变大。

DECLARE @Columns VARCHAR(max);
DECLARE @SQL VARCHAR(max);

SELECT @Columns = concat(@Columns+', ',QUOTENAME(VariableName)) FROM LogTable GROUP BY VariableName;

SET @SQL = 'SELECT * 
FROM (SELECT VariableName, VariableValue, [Timestamp] FROM LogTable) q
PIVOT (MAX(VariableValue) FOR VariableName IN ('+ @Columns +')) p';

EXEC (@SQL);

答案 2 :(得分:0)

结果表示不正确。

enter image description here

这可能有用。我注意到标签可能不一定只是Tag_1,Tag_2,在这种情况下,需要更动态的方法。

  SELECT 
[TimeStamp], ISNULL(Max(Tag_1),'-') as Tag_1,  ISNULL(Max(Tag_2),'-') as Tag_2
FROM
(SELECT * FROM dbo.Table_3) as ST
PIVOT
(
MAX(VariableValue)
FOR VariableName in ([Tag_1], [Tag_2])
) AS PT
 Group By [TimeStamp]

正确表示结果 enter image description here