繁体   English   中英

PostgreSQL:SELECT 多列中整个表的最大数值

[英]PostgreSQL: SELECT MAX numeric value for entire table from multiple columns

我有一个类似的表(3行,4列:id,name,gradeA,gradeB):

id    name    gradeA    gradeB
------------------------------
1     David   59        78
2     Anna    66        92
3     David   22        89

我正在寻找一个查询,它将按条件在整个表中为我提供最高等级的 1 个数字属性。 例如:

任何名叫大卫的学生的最高成绩是多少?

答案应该是 { maxGrade: 89 }

注意:成绩存储为 varchar 值,应转换为数值以进行比较

您需要将max()greatest()结合起来

select max(greatest(gradea::int, gradeb::int)) as max_grade
from the_table
where name = 'David';

如果您需要JSON结果(因为您写道:结果应该是 {maxGrade: 89} ),您可以包装该查询并将该行转换为 JSON:

select to_jsonb(t) 
from (
  select max(greatest(gradea::int, gradeb::int)) as "maxGrade"
  from the_table
  where name = 'David'
) t;

试试下面的:

我们将通过 GREATEST 和 MAX 实现:

  1. 我们可以利用GREATEST返回每个用户记录的 A 级和 B 级列之间的大值
  2. 如果有多个同名用户匹配,则使用MAX返回最高成绩。
SELECT 
  MAX(GREATEST(gradeA::integer, gradeB::integer)) as maxGrade 
FROM 
  "table_name" 
WHERE 
  "table_name"."name" = 'David';

我建议横向连接:

select max(grade::int) as max_grade
from t cross join lateral
     (values (gradea), (gradeb)) v(grade)
where name = 'David';

特别是,如果任何等级是NULL ,则此方法有效。

它也可以很容易地调整以获得最高等级:

select v.*
from t cross join lateral
     (values ('a', gradea), ('b', gradeb)) v(which, grade)
where name = 'David'
order by grade::int desc
limit 1

暂无
暂无

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

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