使用MSQL 2005
我有一组连续的流量测量值(每15分钟时间片的平均值)
我正在尝试编写一个查询来查找每天的最小流量及其发生的时间 找到最小流量很容易,但要花时间更难。
目前我这样做:
select d1.data_point_groupid
, min(d1.timeID) [timeId]
, min(d1.[value]) [value]
from dma.dbo.calculated_average_group_flow d1
where night=1 and round(d1.value, 6)=
(
select round(min(value), 6)
from dma.dbo.calculated_average_group_flow d2
where night=1
and d2.[date]=d1.[date]
and d2.data_point_groupid=d1.data_point_groupid
)
group by d1.data_point_groupid, d1.date
然而,由于舍入错误,这偶尔会不匹配
我也尝试过使用排名但是这个速度太慢我不得不取消查询
select [data_Point_GroupID], [date], [timeId], [value] from
(
select * , Rank() over (Partition BY data_Point_GroupID, [date] order by value ASC) as Rank
from
[calculated_average_group_flow] d2
) d1
WHERE rank=1
calculated_average_group_flow是进行平均计算的另一个视图
有更好的方法吗?
答案 0 :(得分:1)
比较浮点时,需要使用epsilon(我使用下面的1e-9)来避免精度错误:
select d1.data_point_groupid
, min(d1.timeID) [timeId]
, min(d1.[value]) [value]
from dma.dbo.calculated_average_group_flow d1
where night=1 and 1e-9 >=
(
select abs(d1.value - min(d2.value))
from dma.dbo.calculated_average_group_flow d2
where night=1
and d2.[date]=d1.[date]
and d2.data_point_groupid=d1.data_point_groupid
)
group by d1.data_point_groupid, d1.date
答案 1 :(得分:0)
您需要先将值缩小,然后在外部查询中找到与该最小值相关的时间。我不确定你为什么要四舍五入。
select d.data_point_groupid, min_value, timeId
from dma.dbo.calculated_average_group_flow d inner join
(select data_point_groupid, min([value]) as min_value
from dma.dbo.calculated_average_group_flow
where night=1
group by data_point_groupid) mnv on
d.data_point_groupid = mnv.data_point_groupid and
d.[value] = mnv.min_value
where night=1