Как найти наибольшее значение, любое из оставшихся максимальных значений и последнее оставшееся максимальное значение, не использовавшееся ранее - PullRequest
0 голосов
/ 04 октября 2018

Мне нужно использовать max_weight, max_height и max_volume с использованием Oracle SQL следующим образом:

  • Длина = наибольшее значение максимальной высоты, максимальной ширины или максимальной глубины

  • Высота = любое из оставшихся 2 максимальных значений

  • Ширина = последнее оставшееся максимальное значение, не использовавшееся до

Я прикрепилбазовый запрос, чтобы получить максимальные значения, но мне нужно, чтобы выше отфильтрованные данные из этого.

Как написать запрос для вычисления того же значения

sql query] 1

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Предположим, у вас есть следующие данные (столбцы помечены col1, col2, col3 в моем примере; пометить их как "height" или "max_height" довольно бессмысленно, если задача состоит в том, чтобы определить, КАКОЕ изв каждом случае это "высота").

  col1   col2   col3
------ ------ ------
    10      8     15
    11     11     30
    13      9      9
    15      7     15

И вы хотите переставить числа в каждом ряду так, чтобы результат выглядел следующим образом:

length height  width
------ ------ ------
    15     10      8
    30     11     11
    13      9      9
    15     15      7

Вотэффективный способ сделать это - вам не нужно разворачивать входы (чтобы поместить все числа в один длинный столбец).Это работает, потому что GREATEST может дать вам длину, LEAST может дать вам ширину, а чтобы получить среднее, вы можете добавить три числа и вычесть две крайности.Этот упрощенный подход НЕ будет работать, если вам нужно ранжировать четыре или более числовых атрибута, но он отлично работает для трех.

with
  test_data(col1, col2, col3) as(
    select 10,  8, 15 from dual union all
    select 11, 11, 30 from dual union all
    select 13,  9,  9 from dual union all
    select 15,  7, 15 from dual
  )
-- End of simulated data (not part of the solution).
-- SQL query begins BELOW THIS LINE. Use actual table and column names.
select col1, col2, col3,
       greatest(col1, col2, col3)                      as length,
       col1 + col2 + col3 - greatest(col1, col2, col3) 
                          - least(col1, col2, col3)    as height,
       least(col1, col2, col3)                         as width
from   test_data
;

      COL1       COL2       COL3     LENGTH     HEIGHT      WIDTH
---------- ---------- ---------- ---------- ---------- ----------
        10          8         15         15         10          8
        11         11         30         30         11         11
        13          9          9         13          9          9
        15          7         15         15         15          7
0 голосов
/ 04 октября 2018

Тем временем вы можете поработать с этим ... запустите его, чтобы увидеть, каковы результаты, а затем оберните его и используйте Case, когда rmax = 1 ...

select 
    MAXNUM
    ,RANK() over( order by maxnum  desc)as rmax
    ,dim
from (
    select 
        2 as maxnum, 'weight' as dim
    union
    select  
        4 as maxnum, 'length' as dim
    union
    select
        8 as maxnum, 'height' as dim
) as nnn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...