按时间戳和设备

时间:2017-09-13 09:43:15

标签: sql sql-server

我的数据库中有两个表。一个用于我的设备,一个用于记录的值。

我需要在每个时间戳之间检索Delta Value,当然只能从同一个设备中检索。

Devices表我只用于选择设备上的过滤器。在Recorded values表中,我只检索值和时间戳:

我用来显示此数据的一个查询如下:

SELECT    TOP(100) ROW_NUMBER() OVER(ORDER BY dbo.RecordedValues.Timestamp DESC) AS  ROW#, dbo.RecordedValues.Timestamp, dbo.Channels.Description, dbo.RecordedValues.Value, dbo.Channels.Tag
FROM dbo.Channels INNER JOIN dbo.RecordedValues ON dbo.Channels.SourceId = dbo.RecordedValues.SourceId AND dbo.Channels.SourceId = dbo.RecordedValues.ChannelId
WHERE     (dbo.Channels.Description LIKE N'%AL Electra%')

表格示例:

Row|Timestamp              |Description            |Value   |Tag
1  |2017-09-13 10:55:00.077| 51 Electra Consumption|503.3953|AB12
1  |2017-09-13 10:45:00.077| 51 Electra Consumption|493.3953|AB12

让我们说这些是我执行查询时得到的值。现在我想知道delta值。所以我尝试了这段代码:

SELECT TOP (100) ROW_NUMBER() OVER (ORDER BY dbo.RecordedValues.Timestamp DESC) AS Rows, dbo.RecordedValues.Timestamp, dbo.Channels.Description, dbo.RecordedValues.Value, dbo.RecordedValues.Deltavalue, dbo.Channels.Tag, LEAD(dbo.RecordedValues.Value) OVER (ORDER BY dbo.RecordedValues.Timestamp) dbo.RecordedValues.Value
FROM dbo.Channels INNER JOIN dbo.RecordedValues ON dbo.Channels.SourceId = dbo.RecordedValues.SourceId AND dbo.Channels.SourceId = dbo.RecordedValues.ChannelId
WHERE(dbo.Channels.Description LIKE N'%AL Electra%')

然后我得到一个错误Nvarchar无法减去。所以我发现你必须改为INT。由于我没有权利更改数据库中的属性,我认为我可以投射它。

所以我尝试了这段代码,我把它放在select子句中:

(cast(dbo.RecordedValues.Value AS int)), 

如果我执行它,我仍然可以减去它,所以我尝试了一段代码,它允许我计算delta值然后它给了我它不能转换为INT。< / p>

所以我现在不知道该怎么做了。因此,如果有人知道解决方案,请提前感谢。

2 个答案:

答案 0 :(得分:0)

请尝试以下代码

SELECT TOP (100) ROW_NUMBER() OVER (ORDER BY dbo.RecordedValues.Timestamp DESC) AS Rows, 
    dbo.RecordedValues.Timestamp, 
    dbo.Channels.Description, 
    dbo.Channels.Tag, 
    CAST(LEAD(dbo.RecordedValues.Value) OVER (ORDER BY dbo.RecordedValues.Timestamp) AS DECIMAL(10,5)) - 
    CAST(dbo.RecordedValues.Value AS DECIMAL(10,5))
FROM dbo.Channels 
INNER JOIN dbo.RecordedValues ON dbo.Channels.SourceId = dbo.RecordedValues.SourceId AND dbo.Channels.SourceId = dbo.RecordedValues.ChannelId
WHERE(dbo.Channels.Description LIKE N'%AL Electra%');

答案 1 :(得分:0)

首先,简化您的查询,使其可读:

SELECT ROW_NUMBER() OVER (ORDER BY rv.Timestamp DESC) AS Rows, 
       rv.Timestamp, c.Description, rv.Value, rv.Deltavalue, c.Tag,
       (LEAD(rv.Value) OVER (ORDER BY rv.Timestamp) - rv.Value) as diff
FROM dbo.Channels c INNER JOIN
     dbo.RecordedValues rv
     ON c.SourceId = rv.SourceId AND c.SourceId = rv.ChannelId
WHERE c.Description LIKE N'%AL Electra%';

表别名使查询更易于阅读。 <{1}}是不必要的。

要使其正常工作,您需要转换为数字格式。事实上,你应该修复表格!

TOP (100)

也许 - 出于某种原因 - 你不能这样做。如果是这种情况,请使用alter table dbo.RecordedValues alter column Value numeric(20, 4); 。以下是使用子查询的简单方法:

try_convert()