Sql 找出一天中的最小流量及其发生的时间
使用MSQL2005 我有一组连续的流量测量值(每个15分钟时间段的平均值) 我正在尝试编写一个查询,以查找每天的最小流量及其发生的时间 找到最小流量很容易,但获得时间却很难 目前我这样做:Sql 找出一天中的最小流量及其发生的时间,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,使用MSQL2005 我有一组连续的流量测量值(每个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 an
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
计算的平均组流量是进行平均计算的另一个视图
有更好的方法吗?在比较浮点时,需要使用ε(我在下面使用了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
比较浮点时,需要使用ε(我在下面使用了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
您需要首先最小化该值,然后在外部查询中查找与该最小值相关的时间。我不知道你为什么要舍入这个值
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
您需要首先最小化该值,然后在外部查询中查找与该最小值相关的时间。我不知道你为什么要舍入这个值
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
请您添加一个数据示例,以及您希望从中得到什么?数据集非常大且保密。既然问题已经得到了回答,我就不做任何补充了。你能给你的数据加一个例子吗?你希望从中得到什么?数据集非常大而且保密。既然问题已经得到了回答,我不会编造任何东西。我知道我的方法有点难闻!谢谢你提醒我正确的方法。我知道我的方法有点难闻!谢谢你提醒我正确的方法。因为匹配是非常随机的,否则在比较浮点时会出现舍入错误。你能减去它们并引入一个容差级别吗?或者骡子。通过100000000然后比较?是的,谢谢,这正是我所做的,请参阅dcp的响应,因为匹配是非常随机的,否则是由于比较浮点时的舍入错误。你能减去它们并引入公差级别吗?或者骡子。是的,谢谢,这正是我所做的,请参阅dcp的回复