SQL - 获取正值的最高值和负值的最低值

SQL - Get Highest Value For Positive And Lowest Value For Negative

我使用此代码从我的 oracle 数据库服务器获取 AVG 编号,现在我需要代码来获取最高(如果为正)和最低(如果为负)的数字我该怎么做?:

Select AVG(EAX_T) AS EAX, AVG(EAI_T) AS EAI, H 
FROM TABLENAME 
WHERE SR = ? AND TO_DATE(DATEADD) = ?
GROUP BY H 
ORDER BY H ASC

数据可以是这样的:

SR   |H   |EAX_T   |EAI_T
45   |8   |-3      |0
45   |8   |-2      |0
98   |8   |8       |0
98   |8   |2       |0
106  |8   |0       |-1
106  |8   |0       |-9


我想要 sql 查询 select 行按 H 和 SR 分组如果 EAI_T 或 EAX_T 是正数 select 具有最高的行并且如果EAI_T或EAX_T为负数Select最低,如果

45   |8   |-3      |0
45   |8   |-2      |0

SELECT 有 -3 的行 如果

98   |8   |8       |0
98   |8   |2       |0

SELECT 行有 8

更新: 我有 4600 万行 H 是 Hour 的参考,所以一天内我有 1000 台设备,我需要获取 H 中的数据平均值,如果它高于 0,则获取当天的最高数字,如果低于 0,则获取最低的行数我的另一个 table 有这个数据,所以 SR ref 到设备 ID 和在我的新 table 中选择我找到的数据并制作 H1 , H2 ,.... for devices

因为题主在代码中使用了AVG。我猜所有者想要根据 SR 和 H 的 AVG(EAX_T) 正面或负面组的最高或最低数字。

当AVG大于0取MAX时使用CASE,小于0取Min,等于0取0.

 select SR,H , 
    case  
    when AVG(EAX_T) >0 then Max(EAX_T)  
    when AVG(EAX_T) <0 then Min(EAX_T) else 0 end as EAX, 
    case  
    when AVG(EAI_T) >0 then Max(EAI_T)  
    when AVG(EAI_T) <0 then Min(EAI_T) else 0 end as EAI from TABLENAME group by SR,H

我认为楼主的数据只是一组SR和H中的一个签名。我也给@forpas点赞,因为我觉得他的回答符合楼主的想法。

您可以使用 MAX() window 函数:

select distinct t.*
from (
  select t.sr, t.h,
    sign(eax_t) * max(abs(eax_t)) over (partition by sr, h) eax_t,
    sign(eai_t) * max(abs(eai_t)) over (partition by sr, h) eai_t
  from tablename t
) t
order by t.sr, t.h

参见demo
结果:

>  SR |  H | EAX_T | EAI_T
> --: | -: | ----: | ----:
>  45 |  8 |    -3 |     0
>  98 |  8 |     8 |     0
> 106 |  8 |     0 |    -9