我想做的是选择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
答案 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 by
与limit 1
结合使用的子选择。