找出一天中的最小流量及其发生的时间

时间:2010-09-30 15:36:54

标签: sql sql-server sql-server-2005

使用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是进行平均计算的另一个视图

有更好的方法吗?

2 个答案:

答案 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