You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SQL返回300条平均传感器读数结果以优化.NET图表性能?

完美适配300px图表:把数据压缩到300个平均点的SQL方案

嘿,这个场景太常见了——图表宽度有限,太多数据点只会重叠卡顿,完全没必要!我们可以直接用SQL把目标时间范围内的所有数据均匀分成300个时间区间,每个区间计算Value的平均值,同时用区间的中间时间作为x轴点,刚好适配你的300px图表。

针对SQL Server(看你的.NET环境应该是用这个),直接上可运行的查询:

WITH TimeRange AS (
    -- 第一步:先锁定我们要处理的时间范围,算出总跨度并分成300份
    SELECT
        MIN(Date) AS StartDate,
        MAX(Date) AS EndDate,
        -- 总秒数除以300,得到每个区间的时长(秒)
        DATEDIFF(second, MIN(Date), MAX(Date)) / 300 AS IntervalSeconds
    FROM SensorReadings
    WHERE SensorID = '15' AND Date >= DATEADD(hour, -336, GETUTCDATE())
),
AssignGroups AS (
    -- 第二步:给每条数据分配对应的组ID,同一个区间的数据归为一组
    SELECT
        Value,
        Date,
        FLOOR(DATEDIFF(second, TR.StartDate, SR.Date) / TR.IntervalSeconds) AS GroupID
    FROM SensorReadings SR
    CROSS JOIN TimeRange TR
    WHERE SR.SensorID = '15' AND SR.Date >= DATEADD(hour, -336, GETUTCDATE())
)
-- 第三步:按组计算平均值,日期用平均时间作为该点的x轴值
SELECT
    AVG(Value) AS Value,
    -- 把日期转成浮点型计算平均,再转回datetime,得到区间的中间时间
    CAST(AVG(CAST(Date AS float)) AS datetime) AS Date
FROM AssignGroups
GROUP BY GroupID
ORDER BY Date;

核心逻辑说明

  • 均匀分组:不像按小时分组那样固定区间,这个方案会根据你实际的时间范围自动调整区间大小,保证刚好输出300个点(如果数据量不足300条,就输出实际组数)。
  • 性能友好:如果你的Date和SensorID有联合索引,这个查询跑起来会非常快,所有过滤和分组计算都能利用索引。
  • 趋势准确:每个点是对应区间内的平均值,完全能反映数据的整体趋势,不会丢失关键信息。

可选调整

如果你不想用区间的平均时间,而是想用每个区间的起始时间作为x轴,可以把最终查询里的日期计算部分换成:

DATEADD(second, GroupID * TR.IntervalSeconds, TR.StartDate) AS Date

只需要在AssignGroups中把TR.IntervalSeconds和TR.StartDate一起返回,再在最终查询中引用即可。

这样处理后,不管原始数据有几万还是几十万条,最终只会返回最多300个数据点,完美解决图表卡顿的问题!

内容的提问来源于stack exchange,提问作者Web4Deb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:02:14