由于项目需要,需要获取一组数据的的最新一条数据,表结构如下:
- CREATETABLE[dbo].[WUSU_SUOLITest_Table](
- [ID][bigint]IDENTITY(1,1)NOTNULL,
- [ReceiveTime][datetime]NULL,
- [GroupID][bigint]NOTNULL,
- [DataValue][float]NULL,
- [SensorCode][char](10)NOTNULL,
- )
每一个不同的SensorCode代表了一个设备,目前有50个设备,每30秒上报一次数据,ReceiveTime代表上报数据的时间,现在需要获取每一个设备最新一次的数据,
开始我使用如下的查询语句:
- select*fromWUSU_SUOLITest_Tablewhereidin(selectmax(id)fromWUSU_SUOLITest_TablegroupbySensorCode)
实在想不多到什么好的而解决方法,就只能在此表上创建一个触发器,每次插入数据时就把最新的数据放在了一个临时表,又由于临时表最多只有50条数据,速度当然就很好了。
- createTRIGGER[dbo].[UpdateWUSU_LastOriginalDataSUOLI]
- ON[dbo].[WUSU_SUOLITest_Table]
- AFTERINSERT
- AS
- BEGIN
- declare@SensorCodechar(10),@DataValuefloat,@ReceiveTimedatetime,@GroupIDbigint
- select@SensorCode=SensorCode,@DataValue=DataValue,@ReceiveTime=ReceiveTime,@GroupID=GroupIDfrominserted
- updateWUSU_LastOriginalDatasetDataValue=@DataValue,ReceiveTime=@ReceiveTime,GroupID=@GroupID
- whereSensorCode=@SensorCode
- END
当然这是为了获取各种设备最新的一条数据,如果要获取最新的两条数据,最多也就是100条记录,一次类推,只需要把上边的触发器修改一下就可以。
但还有没有更好的方式,在不修改表结构的情况下?目前还没有想到。
有人提供了使用关联子查询的方式,确实比group by好多了,但当数据量大时,十天的数据,依然会很慢,大约20多秒。
- select*fromWUSU_SUOLITest_Tableast
- whereid=(selectmax(id)fromWUSU_SUOLITest_TablewhereSensorCode=t.SensorCode)
讨论贴参考点击打开链接