Как найти столбец с максимальным значением в одной строке с несколькими столбцами? - PullRequest
2 голосов
/ 18 апреля 2020

У меня есть временная таблица следующим образом:

|----------|------------|-------------|--------|-----------|
| Country  | Confirmed  | Unconfirmed | Deaths | Recovered |
|----------|------------|-------------|--------|-----------|
|     A    |   95782    |   1034219   |  6723  |   25892   |
|----------|------------|-------------|--------|-----------|

Мне нужно найти имя столбца (среди четырех заданных столбцов) с максимальным значением. Допустим, мне нужно выяснить, являются ли подтвержденные случаи или неподтвержденные, или смерти, или выздоровления больше для страны A.

В этом случае ожидаемый результат является «неподтвержденным», поскольку он имеет максимальное значение среди четырех указанных столбцов.

Ответы [ 3 ]

2 голосов
/ 18 апреля 2020

Использование GREATEST

SELECT Country, 'unconfirmed', GREATEST(Confirmed, Unconfirmed, Deaths, Recovered)
FROM TAble1;

Еще немного контента

Ваш полный запрос выглядит следующим образом

SELECT
t1.country
, ( case 
        WHEN t1.Confirmed = t2.maxnumber Then 'Confirmed'
        WHEN t1.Unconfirmed = t2.maxnumber Then 'Unconfirmed'
        WHEN t1.Deaths = t2.maxnumber Then 'Deaths'
        WHEN t1.Recovered = t2.maxnumber Then 'Recovered'
        ELSE 'unknown'
    END) type
,t2.maxnumber
FROM table1 t1 inner join
(SELECT 
Country
,GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) maxnumber
FROM table1) t2 ON t1.country = t2.country

Пример

Схема (MySQL v5.7)

CREATE TABLE table1 (
  `Country` VARCHAR(1),
  `Confirmed` INTEGER,
  `Unconfirmed` INTEGER,
  `Deaths` INTEGER,
  `Recovered` INTEGER
);

INSERT INTO table1
  (`Country`, `Confirmed`, `Unconfirmed`, `Deaths`, `Recovered`)
VALUES
  ('A', '95782', '1034219', '6723', '25892'),
  ('B', '95782', '1034219', '6723', '2225892');

Запрос # 1

SELECT
t1.country
, ( case 
        WHEN t1.Confirmed = GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) Then 'Confirmed'
        WHEN t1.Unconfirmed = GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) Then 'Unconfirmed'
        WHEN t1.Deaths = GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) Then 'Deaths'
        WHEN t1.Recovered = GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) Then 'Recovered'
        ELSE 'unknown'
    END) type
,GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered )
FROM table1 t1;

| country | type        | GREATEST(Confirmed  , Unconfirmed , Deaths , Recovered ) |
| ------- | ----------- | -------------------------------------------------------- |
| A       | Unconfirmed | 1034219                                                  |
| B       | Recovered   | 2225892                                                  |

Посмотреть на БД Fiddle

1 голос
/ 18 апреля 2020

Один из вариантов - отключить и использовать row_number(), чтобы определить столбец с большинством случаев для каждой страны:

select country, case_type, nb_cases
from (
    select 
        t.*, row_number() over(partition by country order by nb_cases desc) rn
    from (
        select country, 'confirmed' case_type, confirmed nb_cases from mytable
        union all
        select country, 'unconfirmed', unconfirmed from mytable
        union all
        select country, 'deaths', deaths from mytable
        union all
        select country, 'recovered', recovered from mytable
    ) t
) t
where rn = 1

Демонстрация на DB Fiddle :

| country | case_type   | nb_cases |
| ------- | ----------- | -------- |
| A       | unconfirmed | 1034219  |
0 голосов
/ 18 апреля 2020

Вы можете использовать greatest() и case:

select t.*,
       (case greatest(Confirmed, Unconfirmed, Deaths, Recovered)
             when Confirmed then 'Confirmed'
             when Unconfirmed then 'Unconfirmed'
             when Deaths then 'Deaths'
             when Recovered then 'Recovered'
       end) as column_greatest
from t;

Две ноты.

Во-первых, это не работает, если какой-либо из столбцов NULL. У вас нет образца, предполагающего, что это так. Но, учитывая, что значения никогда не бывают отрицательными, вы можете использовать COALESCE(), если могут присутствовать значения NULL.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...