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

SQL-获取正值的最高值和负值的最低值,sql,oracle19c,Sql,Oracle19c,我使用此代码从我的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

我使用此代码从我的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


我希望sql查询按H和SR选择行组如果EAI\u T或EAX\u T为正数选择具有最高值的行,如果EAI\u T或EAX\u T为负数选择最低值,如果

45   |8   |-3      |0
45   |8   |-2      |0
选择具有-3的行 如果

选择具有8个字符的行

更新:
我有4600万行,H是对小时的引用,所以在一天中我有1000台设备,我需要得到H中的数据平均值,如果它高于0,则得到当天的最高值,如果低于0,则得到最低行,以生成另一个包含此数据的表,所以SR ref到设备Id,在我的新表中,我将选择我找到的数据并生成H1,H2。。。。对于设备

,因为问题所有者在代码中使用AVG。我猜所有者希望根据SR和H的平均正或负组得到最高或最低的数字

当平均值大于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,因为我认为他的答案与所有者的想法相符。

您可以使用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
看。 结果:


你能提供更多关于get数字的细节吗?如果是正数,则最高;如果是负数,则最低@劉鎮瑲 帖子更新,对不起我的英语分享你的意思是:选择S,当AVGEAX\u T>0时为case,然后当AVGEAX\u T时为MaxEAX\T我建议你在帖子中给出你拥有的数据和你想要的结果。它可以帮助更多的人知道你想要什么。您的表包含每个设备SR和H.2小时的多行。每个设备需要每小时EAX_T和EAI_T的平均值。3.如果一小时的平均EAX_T为负值,则需要该小时的最小EAX_T。如果一小时的平均EAX_T为正值,则需要该小时的最大EAX_T。EAI_T也一样。如果是这样,那么劉鎮瑲's的查询符合您的要求,而forpas的查询不符合您的要求。请不要只发布代码作为答案,还要解释代码的作用以及它如何解决问题。带有解释的答案通常更有帮助,质量更好,更容易吸引选票@劉鎮瑲 谢谢你的帮助
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