簡體   English   中英

在 MySQL 中,我如何 Select 在一行中具有最高值的列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM