Предположим, у вас есть следующие данные (столбцы помечены 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