簡體   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