SQL查询从MySQL表中的列中获取最高值和相应的日期

zaq34kh6  于 2023-06-05  发布在  Mysql
关注(0)|答案(1)|浏览(533)

我需要一个SQL查询,从列中获得最大的数字:1、2、4和5,然后返回相应的日期和最高值。
我有这个数据库:
tabela:
| 日期|列1| coluna2| coluna3| coluna4| coluna5|
| - -----|- -----|- -----|- -----|- -----|- -----|
| 2023-04-01 2023-04-01| 1| 2|八十八|九个|5个|
| 2023-03-02 2023-03-02|二十个|十一|八十五|1|五十五|
| 2023-05-14 2023-05-14 2023-05-14|十二岁|三十一|八|2|十二岁|
| 2023-01-04 2023-01-04|十四|五十四|4|四十五|四十六|
| 2023-03-15 2023-03-15 2023-03-15| 5个|四十五|五十五|3|七十五|
预期结果:
| | | |
| - -----|- -----|- -----|
| 列1| 2023-03-02 2023-03-02|二十个|
| coluna2| 2023-01-04 2023-01-04|五十四|
| coluna4| 2023-01-04 2023-01-04|四十五|
| coluna5| 2023-03-15 2023-03-15 2023-03-15|七十五|

wqsoz72f

wqsoz72f1#

在MySQL 8.x中,一个选项是 unpivot(将列转换为行) 数据,然后使用row_number函数获取每列具有最大值的行。

with t as
(
  select t.date_, u.val, u.colunax,
     row_number() over (partition by u.colunax order by u.val desc) rn
  from tbl t
  cross join lateral (
    select coluna1, 'coluna1' union all
    select coluna2, 'coluna2' union all
    select coluna4, 'coluna4' union all
    select coluna5, 'coluna5'
  ) as u(val, colunax)
)
select date_, colunax, val
from t
where rn = 1

如果您的版本不支持lateral derived tables,您可以使用union all来取消数据透视。

with t as
(
  select date_, coluna1 val, 'coluna1' colunax from tbl union all
  select date_, coluna2, 'coluna2' from tbl union all
  select date_, coluna4, 'coluna4' from tbl union all
  select date_, coluna5, 'coluna5' from tbl
),
t2 as
(
 select date_, val, colunax,
     row_number() over (partition by colunax order by val desc) rn
  from t
)
select date_, colunax, val
from t2
where rn = 1

demo

相关问题