繁体   English   中英

如何在具有多列的单行中找到具有最大值的列?

[英]How to find the column with maximum value within a single row with multiple columns?

我有一个临时表如下:

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

我需要找到具有最大值的 column_name(在四个给定的列中)。 假设我需要找出 A 国的确诊病例或未确诊病例或死亡病例或康复病例是否更多。

在这种情况下,预期的 output 是“未确认的”,因为它在四个给定列中具有最大值。

使用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                                                  |

在 DB Fiddle 上查看

一种选择是取消透视并使用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  |

您可以使用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 ,这将不起作用。 您没有样本表明情况如此。 但鉴于这些值永远不会是负数,如果可能存在NULL值,您可以使用COALESCE()

其次,如果存在平局,则返回具有最大值的第一列。 再一次,您没有指定要做什么,因此这似乎是对该问题的合理解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM