在SQL中选择max over multiple fields的最佳方法是什么?

时间:2009-07-25 21:21:37

标签: sql

我想做的是选择max(f1,f2,f3)。我知道这不起作用,但我认为我想要的应该非常清楚(见更新1)。

我在考虑选择max(concat(f1,' - ',f2 ...)),但这有各种缺点。特别是,做concat可能会减慢速度。得到我想要的最好的方法是什么?

更新1:到目前为止我得到的答案并非我所追求的。 max对一组记录起作用,但只使用一个值对它们进行比较;我希望max考虑几个值,就像order by的方式可以考虑几个值。

更新2:假设我有下表:

id class_name order_by1 order_by_2
 1          a         0          0
 2          a         0          1
 3          b         1          0
 4          b         0          9

我想要一个通过class_name对记录进行分组的查询。然后,在每个“类”中,如果按order_by1升序然后order_by2升序排序,则选择首先出现的记录。结果集将包含记录2和3.在我的神奇查询语言中,它看起来像这样:

select max(* order by order_by1 ASC, order_by2 ASC)
from table
group by class_name

4 个答案:

答案 0 :(得分:4)

Select max(val)
From
(
  Select max(fld1) as val FROM YourTable
  union
  Select max(fld2) as val FROM YourTable
  union
  Select max(fld3) as val FROM YourTable
) x

修改:另一种选择是:

SELECT
    CASE 
        WHEN MAX(fld1) >= MAX(fld2) AND MAX(fld1) >= MAX(fld3) THEN MAX(fld1)
        WHEN MAX(fld2) >= MAX(fld1) AND MAX(fld2) >= MAX(fld3) THEN MAX(fld2)
        WHEN MAX(fld3) >= MAX(fld1) AND MAX(fld3) >= MAX(fld2) THEN MAX(fld3)
    END AS MaxValue
FROM YourTable

答案 1 :(得分:3)

我有其中一个。

CREATE FUNCTION [dbo].[MathMax]  
(  
 @a int,  
 @b int  
)  
RETURNS int  
WITH SCHEMABINDING  
AS  
BEGIN  
 IF @a IS NULL AND @b IS NULL   
  RETURN 0  

 IF @a IS NULL   
  RETURN @b  

 IF @b IS NULL   
  RETURN @a  

 IF @a < @b   
  RETURN @b  

 RETURN @a  
END  

然后我可以做SELECT dbo.MathMax(dbo.MathMax(MAX(f1),MAX(f2)),MAX(f3))FROM T1

我相信这与CASE大致相同,同时更具可读性,并且比多UNION(甚至更高效的UNION ALL)表现更好。

答案 2 :(得分:1)

根据我给另一个问题的回答:SQL - SELECT MAX() and accompanying field

要使其适用于多个列,请在内部选择的ORDER BY中添加更多列。

答案 3 :(得分:1)

您可以按进行分组(可以是多列),并在列列表中使用普通order bylimit 1结合使用的子选择。