В MySQL Как выбрать столбец в строке с наибольшим значением - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть таблица цен / тарифов для клиентов, которая, вероятно, могла бы быть более нормализованной, но через 10 лет она стала такой. Для краткости, вот соответствующие столбцы:

id
client_id
service_1_rate
service_2_rate
[. . .]
service_10_rate

Мне нужно знать для каждого столбца, какова самая высокая ставка, которую я взимаю с этого конкретного клиента.

Это не Сценарий MAX () - я не пытаюсь найти, какая строка имеет максимальное значение в определенном столбце - я пытаюсь выяснить, для каждой строки, какой столбец в этой строке имеет наибольшее значение.

Спасибо !

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Для проверки одной строки мы могли бы использовать функцию GREATEST для возврата наибольшего значения. Демонстрация с литералами:

SELECT GREATEST( 2 , 3 , 42 , 5 , 7 ) AS highest_val

Мы можем использовать имена столбцов (или другие выражения) вместо литералов; если какое-либо из выражений равно NULL, функция вернет NULL.

Но это только оценивает значение , но не говорит нам, какое выражение в списке предоставило это значение. Мы можем найти в списке выражений соответствующее значение и вернуть позицию в списке. (Если несколько выражений имеют одинаковое наибольшее значение, возвращается позиция первого встреченного, например,

SELECT FIELD( GREATEST( 2 , 3 , 42 , 42 , 7 ), 2 , 3 , 42 , 42 , 7 ) AS which_is_highest 

. Мы можем перевести эту позицию в строку, используя функцию ELT. Например:

SELECT ELT(3, 'first', 'second', 'third', 'fourth' )

Собираем все это вместе ...

Для краткости, давайте предположим, что нам нужно оценить шесть столбцов r1, r2, r3, r4, r5 и r6. также предположим, что столбцы не могут (или не будут) когда-либо содержать значения NULL.

Чтобы получить одно наибольшее значение из шести столбцов:

 SELECT ...
      , GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)  AS highest_val
   FROM t
  ORDER BY ...

Чтобы получить имя столбец, вернувший наибольшее значение:

SELECT ...
     , ELT(
         FIELD(
           GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
         ,t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
       ,'r1','r2','r3','r4','r5','r6')          AS col_with_highest_val
     , ...
  FROM t
0 голосов
/ 20 апреля 2020

Вы можете использовать функцию greatest(), чтобы получить самый высокий уровень обслуживания:

select id, client_id, 
  greatest(service_1_rate, service_2_rate, . . ., service_10_rate) highest
from tablename

Если вы хотите, чтобы индекс столбца с самым высоким Для оценки вы также можете использовать функцию field():

select id, client_id, 
  field(
    greatest(service_1_rate, service_2_rate, . . ., service_10_rate), 
    service_1_rate, service_2_rate, . . ., service_10_rate
  ) highest
from tablename

Или, если вы хотите получить имя столбца с наибольшей скоростью, вы можете использовать выражение CASE:

select id, client_id, 
  case greatest(service_1_rate, service_2_rate, . . ., service_10_rate) 
    when service_1_rate then 'service_1_rate'
    when service_2_rate then 'service_2_rate' 
    .........................................
  end highest
from tablename
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...