Найти минимальный поток за день и время его возникновения - PullRequest
1 голос
/ 30 сентября 2010

с использованием 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 ]

1 голос
/ 30 сентября 2010

При сравнении с плавающей запятой вам нужно использовать эпсилон (я использовал 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
0 голосов
/ 30 сентября 2010

сначала нужно минимизировать значение, а затем найти время, связанное с этим минимальным значением, во внешнем запросе.Я не уверен, почему вы округляете значение.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...