我做了一些个人查询,我想合并在一张表中。每个查询检索F1,F2,F3和总数的日期和值。简化SQL代码
我想知道我是否可以使这个查询更容易,尤其是如何实现这一点。所以更少的代码,但实现相同的事情。特别是当我想稍后将其扩展到F20时。
查询只是将数据每15分钟添加一次。
2017-09-20 10:15 |49.0000|f1.1
2017-09-20 10:15 |40.0000|f1.2
2017-09-20 10:15 |11.0000|f1.3
2017-09-20 10:15 |0.0000|f1.4
2017-09-20 10:15 |0.0000 |f1.5
2017-09-20 10:15 |0.0000 |f1.6
查询给我时间的总和。 2017-09-20 10:15
如果我尝试条件聚合。它给出了所有delta值的总和。但它应该只将相同日期的值相加。
declare @days int
set @days = -165
SELECT a.Date, a.F1, b.F2, c.F3, d.Total
FROM
(SELECT rv.Date, sum(rv.value_num) as F1
FROM dbo.Channels c INNER JOIN
(SELECT rv.*, TRY_CONVERT(numeric(20, 4), rv.Value) AS value_num, (LEFT(TRY_CONVERT(datetime2(0), rv.Timestamp), 16)) AS Date
FROM dbo.RecordedValues rv) rv ON c.SourceId = rv.SourceId AND c.Id = rv.ChannelId
WHERE c.Tag LIKE N'%F1%'
AND Timestamp BETWEEN DATEADD(day,@days,GETDATE()) AND GETDATE()
GROUP BY rv.Date
) as a,
(SELECT rv.Date, sum(rv.value_num) as F2
FROM dbo.Channels c INNER JOIN
(SELECT rv.*, TRY_CONVERT(numeric(20, 4), rv.Value) AS value_num, (LEFT(TRY_CONVERT(datetime2(0), rv.Timestamp), 16)) AS Date
FROM dbo.RecordedValues rv) rv ON c.SourceId = rv.SourceId AND c.Id = rv.ChannelId
WHERE c.Tag LIKE N'%F2%'
AND Timestamp BETWEEN DATEADD(day,@days,GETDATE()) AND GETDATE()
GROUP BY rv.Date
) as b,
( SELECT rv.Date, sum(rv.value_num) as F3
FROM dbo.Channels c INNER JOIN
(SELECT rv.*, TRY_CONVERT(numeric(20, 4), rv.Value) AS value_num, (LEFT(TRY_CONVERT(datetime2(0), rv.Timestamp), 16)) AS Date
FROM dbo.RecordedValues rv) rv ON c.SourceId = rv.SourceId AND c.Id = rv.ChannelId
WHERE c.Tag LIKE N'%F3%'
AND Timestamp BETWEEN DATEADD(day,@days,GETDATE()) AND GETDATE()
GROUP BY rv.Date
) as c,
(SELECT rv.Date, sum(rv.value_num) as Total
FROM dbo.Channels c INNER JOIN
(SELECT rv.*, TRY_CONVERT(numeric(20, 4), rv.Value) AS value_num, (LEFT(TRY_CONVERT(datetime2(0), rv.Timestamp), 16)) AS Date
FROM dbo.RecordedValues rv) rv ON c.SourceId = rv.SourceId AND c.Id = rv.ChannelId
WHERE c.Tag LIKE N'%F%'
AND Timestamp BETWEEN DATEADD(day,@days,GETDATE()) AND GETDATE()
GROUP BY rv.Date
) as d
where a.Date = b.Date
AND b.Date = c.Date
AND c.Date = d.Date
这是目前如何给我的价值观:
RecDate F1 |F2 |F3 |Total
2017-09-20 10:15| 100 |200|100|400
2017-09-20 10:30| 150 |200|150|500
2017-09-20 10:45| 125 |200|100|425
2017-09-20 11:00| 110 |210|110|440
etc.
即使您简化查询,性能也会变差*,因为像LIKE'%F1%'这样的每个子句都会强制进行全表扫描。 'tag'包含什么? –
如果您可以提供原始数据的样本,以及您期望输出的样子,这将是一个很大的帮助。看看[how-to-ask](http://stackoverflow.com/help/how-to-ask)页面,了解一些提炼你的问题的提示。 – gmiley
为什么'(LEFT(TRY_CONVERT(datetime2(0),rv.Timestamp),16)''你将* something *转换为datetime2然后转换为一个字符串,然后将其截断?为什么?是否要将某些东西转换为'日期'也许?'时间戳'的类型是什么? –