Sql 表联接和排序

Sql 表联接和排序,sql,sql-server,sorting,join,Sql,Sql Server,Sorting,Join,我有一个SQL表,用于存储从自动化流程记录的流程数据。该表存储变量名、记录值和时间戳。该表如下所示: VariableName | VariableValue | Timestamp ------------------------------------------ Tag_1 | 1 | Time_1 Tag_1 | 5 | Time_2 Tag_1 | 4 |

我有一个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脚本来实现这一目的。但是,我不知道如何制定查询(连接???)以实现该结构…

Yo可以使用此查询:

看它继续跑。输出:

您不能直接使用动态列列表执行此操作,但在编程环境(或TSQL with)中,您可以动态生成此查询。

Yo可以使用此查询:

看它继续跑。输出:


您不能直接使用列的动态列表执行此操作,但在编程环境(或TSQL with)中,您可以动态生成此查询。

结果的表示不正确

这可能有用。我注意到标签不一定只是标签1、标签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]
结果的正确表示
结果的表示不正确

这可能有用。我注意到标签不一定只是标签1、标签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]
结果的正确表示

使用带有的

首先计算列名的@Columns变量

LogTable用于获取标记名。但若您有一个带有已知标记的引用表,那个么最好将其建立在该引用表的基础上。因为日志表往往会变大。

将a与a一起使用

首先计算列名的@Columns变量

LogTable用于获取标记名。但若您有一个带有已知标记的引用表,那个么最好将其建立在该引用表的基础上。因为日志表往往会变大。



你好。您是否看过或熟悉透视表。这会给你你想要的。查找SQL PIVOT。您好。您是否看过或熟悉透视表。这会给你你想要的。查找SQL PIVOT。在这种情况下不需要
子选择。它可以是
。从mytable PIVOT(最小值(可变值)…
开始,它应该是动态的,OP已经提到
标记1、标记2等。
更新,@Pரதீப். 谢谢!
子选择在这种情况下不需要。它可以是
。从mytable PIVOT(最小值(可变值)
,它应该是动态的,OP已经提到了
标记1、标记2等。
更新,@Pரதீப். 谢谢!
groupby
不会有任何区别,因为请求的输出是按时间戳分组的?否则,时间戳将根据我的屏幕截图重复(不分组)但请随意更正我的解决方案。我们都在学习。最后一个结果表似乎与我想要实现的目标相对应。正如所指出的,我将处理的数据将是日志数据,因此该表可能相当大。我希望该解决方案允许我使用任意变量名。尽管我预先知道变量名是什么,它们可能根本不会出现在日志表中,因为标记的值没有改变,例如……还有一个注释:动态执行查询更好吗,例如,通过一个脚本来实现for循环,或者上面的查询会完成任务吗?@SQLAndOtherStuffGuy,时间戳是自动执行的通过使用
pivot
语法进行分组。请查看它的运行情况。如果在您的环境中不是这样,则说明存在错误(数据、引擎类型或其他方面).
groupby
不会产生任何差异,因为请求的输出是按时间戳分组的?否则,时间戳将根据我的屏幕截图重复(不分组)但请随意更正我的解决方案。我们都在学习。最后一个结果表似乎与我想要实现的目标相对应。正如所指出的,我将处理的数据将是日志数据,因此该表可能相当大。我希望该解决方案允许我使用任意变量名。尽管我预先知道变量名是什么,它们可能根本不会出现在日志表中,因为标记的值没有改变,例如……还有一个注释:动态执行查询更好吗,例如,通过一个脚本来实现for循环,或者上面的查询会完成任务吗?@SQLAndOtherStuffGuy,时间戳是自动执行的通过使用
pivot
语法对其进行分组。请查看它是否运行。如果您的环境中不是这样,则说明存在错误(数据、引擎类型或其他方面)。解决方案很好!最后一行可以是
EXEC(@SQL)
@trincot-True,将其改回。解决方案很好!最后一行可以是
EXEC(@SQL);
@trincot-True,将其改回。
  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]
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);