【发布时间】:2018-05-10 16:44:56
【问题描述】:
我们有一个系统,该系统每小时可存储来自各种传感器的 1000 条读数。这些值被发送到 .net 图表模块中。它可以工作,但是当您查看几天的数据时,基本上有成千上万的结果被输入到图表中,并且处理它们的速度很慢。作为一个快速修复,我将其设置为将所有结果分组并平均到一个小时桶中,方法是将日期列分解为小时(去掉分钟和秒)。这工作得更快,但我希望它变得更好。这是当前(庞大的)查询:
SELECT Value, CAST(CAST(yr AS char(4)) + '/' + CAST(mth AS char(2)) + '/' + CAST(dte AS char(2)) + ' ' + CAST(hr AS char(2)) + ':00:00' AS datetime) AS Date FROM (SELECT AVG(Value) AS Value, DATEPART(year, Date) AS yr, DATEPART(month, Date) AS mth, DATEPART(day, Date) AS dte, DATEPART(hour, Date) AS hr FROM SensorReadings WHERE (SensorID='15') AND (Date >= DATEADD(hour, - 336, getutcdate())) GROUP BY DATEPART(year, Date), DATEPART(month, Date), DATEPART(day, Date), DATEPART(hour, Date)) AS derivedtbl_1 ORDER BY date
这可以返回几千个结果。让可能只有 300 像素宽的图表模块尝试绘制基本上会重叠的 1000 个点似乎仍然没有效率。
我的问题是:有没有办法告诉 SQL 只返回 300 个结果并让它平均 Value 和 Date 列?粗略地类似于“仅选择 300 avg(value) 作为 Value,ave(date) as Date from SensorReadings order by Date”
谢谢!
【问题讨论】:
-
您可以使用 TOP docs.microsoft.com/en-us/sql/t-sql/queries/… 选择最近的值。如果您最近的值位于表的底部,您可能需要执行 ORDER BY ID ASC 或 DESC 以获取表顶部的最新数据。遗憾的是,我目前没有安装 MSSQL 来测试它。
标签: sql .net sql-server