Sql server 平均给定时间的值,并生成数据透视表
我有一张这样的桌子:Sql server 平均给定时间的值,并生成数据透视表,sql-server,pivot,Sql Server,Pivot,我有一张这样的桌子: time | sensor | value | --------------------------- 10:00:00 | 1 | 12.3 | 10:00:00 | 2 | 14.3 | 10:00:00 | 3 | 15.3 | 10:00:01 | 1 | 15.3 | 10:00:02 | 2 | 11.3 | 10:00:01 | 3 | 10.3 | 10:00:03 | 1
time | sensor | value |
---------------------------
10:00:00 | 1 | 12.3 |
10:00:00 | 2 | 14.3 |
10:00:00 | 3 | 15.3 |
10:00:01 | 1 | 15.3 |
10:00:02 | 2 | 11.3 |
10:00:01 | 3 | 10.3 |
10:00:03 | 1 | 9.3 |
10:00:03 | 2 | 15.3 |
10:00:04 | 3 | 11.3 |
...
10:05:01 | 1 | 15.3 |
10:05:02 | 2 | 11.3 |
10:05:01 | 3 | 10.3 |
10:05:03 | 1 | 9.3 |
10:05:03 | 2 | 15.3 |
10:05:04 | 3 | 11.3 |
我需要一个数据透视表,其中测量值按时间间隔(比如一分钟)平均,并按传感器排序:
time | sensor 1| sensor 2| sensor 3|
----------------------------------------
10:00:00 | 11 | 12 | 10 |
10:01:00 | 10 | 13 | 15 |
...
我在MySQL中学会了如何做到这一点,但现在我不得不使用SQL Server,显然这与MySQL完全不同
任何帮助都是感激的,一些非琐碎的教程也会很有帮助
编辑
在Giorgi Nakeuri回复后尝试:
DECLARE @cols VARCHAR(MAX)
SELECT STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups
GROUP BY [Group]
FOR XML PATH('')), 1, 2, '') + ']'
DECLARE @s VARCHAR(MAX) = 'with cte as(
SELECT tblData.Timestmp, tblSeries.GroupID as SensorID, tblData.SeriesID, tblData.DataValue
FROM tblData
INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID
WHERE (tblSeries.[SeriesName] = ' + 'ActivePower'
+ 'AND tblData.Timestmp > ' + '2015-02-05 00:00:00' + ' AND tblData.Timestmp < ' + '2015-02-05 23:59:59'
+ 'AND tblData.DataValue>100)
)
select * from cte
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p'
EXEC(@s)
这是传感器ID,但不是透视表…尝试以下操作:
select * from someTable
pivot(AVG(value) for sensor in([1],[2],[3])) p
如果表中显示了更多列,则:
with cte as(select time, sensor, value from someTable)
select * from cte
pivot(AVG(value) for sensor in([1],[2],[3])) p
动态版本:
DECLARE @cols VARCHAR(MAX) = ''
SELECT @cols = STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups
WHERE [Group] <> 'meteo'
GROUP BY [Group]
FOR XML PATH('')), 1, 2, '') + ']'
DECLARE @s VARCHAR(MAX) = 'with cte as(
SELECT DATEADD(mi, datediff(mi, 0, tblData.Timestmp), 0) Timestmp, tblSeries.GroupID as SensorID, tblData.DataValue
FROM tblData INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID
WHERE tblSeries.[SeriesName] = ' + '''ActivePower''' + ' AND tblData.Timestmp > ''' + '2015-02-05 00:00:00''' + '
AND tblData.Timestmp < ' + '''2015-02-05 23:59:59''' + ' AND tblData.DataValue>100
)
select * from cte
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p'
EXEC( @s)
如何自动生成列表[1]、[2]、[3]?我可以只使用Select语句吗?因为在现实生活中,我有成百上千的传感器。你想得到柱的手簧片吗?是的,没问题。谢谢你的回答,我试过了,但有些东西还不正确。@SantiPeñate Vera,您的表中有3行以上的行吗?请尝试使用+和tblData.Timestmp>2015-02-05 00:00:00和tblData.Timestmp<2015-02-05 23:59:59'也将其更改为“tblSeries.[SeriesName]=ActivePower”+,而不是exec@s打印@s并查看您是否正确构造了查询
DECLARE @cols VARCHAR(MAX) = ''
SELECT @cols = STUFF((SELECT '],[' + CAST([Group] AS VARCHAR(10)) FROM tblGroups
WHERE [Group] <> 'meteo'
GROUP BY [Group]
FOR XML PATH('')), 1, 2, '') + ']'
DECLARE @s VARCHAR(MAX) = 'with cte as(
SELECT DATEADD(mi, datediff(mi, 0, tblData.Timestmp), 0) Timestmp, tblSeries.GroupID as SensorID, tblData.DataValue
FROM tblData INNER JOIN tblSeries ON tblData.SeriesID = tblSeries.SeriesID
WHERE tblSeries.[SeriesName] = ' + '''ActivePower''' + ' AND tblData.Timestmp > ''' + '2015-02-05 00:00:00''' + '
AND tblData.Timestmp < ' + '''2015-02-05 23:59:59''' + ' AND tblData.DataValue>100
)
select * from cte
pivot(AVG(DataValue) for GroupID in(' + @cols + ' )) p'
EXEC( @s)