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