SQL - получить максимальное значение для положительного и минимальное значение для отрицательного - PullRequest
0 голосов
/ 06 августа 2020

Я использую этот код для получения номера AVG с моего 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_T ИЛИ EAX_T - положительное число, выберите строку с максимальным значением и если EAI_T или EAX_T отрицательны, выберите самый низкий , Если

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

ВЫБЕРИТЕ СТРОКУ, которая имеет -3 И если

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

ВЫБЕРИТЕ строку, которая имеет 8

Обновление: у меня 46 миллионов строк. в час, поэтому за один день у меня есть 1000 устройств, и мне нужно получить среднее значение данных в H, и если оно выше 0, получить максимальное число за день, а если меньше 0, получить самые низкие строки, чтобы сделать мою другую таблицу с этими данными, поэтому SR ref на идентификатор устройства и в моей новой таблице я выбрал данные, которые я нашел, и сделал H1, H2, .... для устройств

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Вы можете использовать функцию окна 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
1 голос
/ 06 августа 2020

Потому что вопрос-владелец использует AVG в коде. Я предполагаю, что владелец хочет наивысшее или наименьшее число в соответствии с положительной или отрицательной группой AVG (EAX_T) по SR и H.

Использование CASE, когда AVG больше 0 получает MAX, меньше 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 положительный голос, потому что я думаю, что его ответ соответствует мысли владельца.

...