【问题标题】:How to find the column with maximum value within a single row with multiple columns?如何在具有多列的单行中找到具有最大值的列?
【发布时间】:2020-04-18 14:31:50
【问题描述】:

我有一个临时表如下:

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

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

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

【问题讨论】:

  • 你运行的是哪个版本的 MySQL?
  • MySQL 8.0.我想这是最新版本吧?
  • 如果您使用临时表,请尝试使用转置列创建表。结构简单:Country, Type_of_result, Result。您可以使用 group 函数来汇总或排序任何结果组合。
  • 见规范化。数据库表不是电子表格!!

标签: mysql sql greatest-n-per-group unpivot


【解决方案1】:

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

View on DB Fiddle

【讨论】:

  • GREATEST 实际上有效,但它仅返回相应列的值,即 1034219。我希望列名作为输出,即“未确认”。
  • 所以添加了完整的查询,我又添加了一行以显示其他情况
【解决方案2】:

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

Demo on DB Fiddle

| country | case_type   | nb_cases |
| ------- | ----------- | -------- |
| A       | unconfirmed | 1034219  |

【讨论】:

    【解决方案3】:

    您可以使用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()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2015-07-07
      • 2022-06-26
      • 1970-01-01
      • 2021-05-24
      相关资源
      最近更新 更多