![](/img/trans.png)
[英]How do I SELECT the ROW with Highest Value in a Query with SUM() and JOIN?
[英]In MySQL, How do I Select the Column in a Row with the Highest Value
我有一個客戶價格/費率表,可能會更加規范化,但 10 年后,它就是這樣。 為簡潔起見,以下是相關列:
id
client_id
service_1_rate
service_2_rate
[. . .]
service_10_rate
我需要知道,對於每一列,我向該特定客戶收取的最高費率是多少。
這不是 MAX() 方案——我不是試圖找出哪一行在特定列中具有最大值——我試圖為每一行找出該行中的哪一列具有最高值。
謝謝!
您可以使用 function best greatest()
獲得最高的服務率:
select id, client_id,
greatest(service_1_rate, service_2_rate, . . ., service_10_rate) highest
from tablename
如果您想要具有最高評級的列的索引,您還可以使用 function field()
:
select id, client_id,
field(
greatest(service_1_rate, service_2_rate, . . ., service_10_rate),
service_1_rate, service_2_rate, . . ., service_10_rate
) highest
from tablename
或者,如果您想要具有最高比率的列的名稱,您可以使用CASE
espression:
select id, client_id,
case greatest(service_1_rate, service_2_rate, . . ., service_10_rate)
when service_1_rate then 'service_1_rate'
when service_2_rate then 'service_2_rate'
.........................................
end highest
from tablename
為了檢查單行,我們可以使用GREATEST
function 返回最大值。 帶有文字的演示:
SELECT GREATEST( 2 , 3 , 42 , 5 , 7 ) AS highest_val
我們可以使用列名(或其他表達式)代替文字; 如果任何表達式是 NULL,則 function 將返回 NULL。
但這僅評估value ,並沒有告訴我們列表中的哪個表達式提供了該值。 我們可以在表達式列表中搜索匹配值,並在列表中返回 position。 (如果多個表達式的最大值相同,則返回遇到的第一個表達式的 position,例如
SELECT FIELD( GREATEST( 2 , 3 , 42 , 42 , 7 ), 2 , 3 , 42 , 42 , 7 ) AS which_is_highest
我們可以使用ELT
function 將 position 轉換為字符串。 舉個例子:
SELECT ELT(3, 'first', 'second', 'third', 'fourth' )
把所有這些放在一起...
為簡潔起見,假設我們需要評估六列 r1、r2、r3、r4、r5 和 r6。 我們還假設列不能(或不會)包含 NULL 值。
要從六列中獲取一個最高值:
SELECT ...
, GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6) AS highest_val
FROM t
ORDER BY ...
要獲取返回最高值的列的名稱:
SELECT ...
, ELT(
FIELD(
GREATEST(t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
,t.r1,t.r2,t.r3,t.r4,t.r5,t.r6)
,'r1','r2','r3','r4','r5','r6') AS col_with_highest_val
, ...
FROM t
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.