sql-获取正值的最大值和负值的最小值

9ceoxa92  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(820)

我用这个代码从我的oracle数据库服务器获取平均数,现在我需要代码来获取最大值(如果是正的话)和最小值(如果是负的话),我该怎么做

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

如果eai\u t或eax\u t为正数,请选择具有最高值的行;如果eai\u t或eax\u t为负数,请选择最低值,如果

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

选择具有-3的行,如果

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

选择具有8的行
更新:我有4600万行,h是指小时,所以在一天内我有1000台设备,我需要得到h中的数据平均值,如果它高于0,得到一天中的最高值,如果最低值低于0,得到最低的行,用这个数据生成另一个表,所以sr ref到设备id,在我的新表中,我将选择我找到的数据,并生成h1,h2。。。。对于设备

bvjxkvbb

bvjxkvbb1#

因为问题所有者在代码中使用了avg。我猜所有者希望根据sr和h的平均值(eax\u t)正或负分组得到最高或最低的数字。
当平均值大于0时取最大值,小于0时取最小值,等于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 upvote,因为我认为他的答案符合主人的想法。

wqnecbli

wqnecbli2#

可以使用max()窗口函数:

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

请看演示。
结果:

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

相关问题