2

我有一个类似于以下的场景,我想做的就是找到三列的最大值 - 这似乎是我用来查找列的一个非常冗长的方法mx

什么是更短更优雅的解决方案?

CREATE TABLE #Pig
(
   PigName CHAR(1),
   PigEarlyAge INT,
   PigMiddleAge INT,
   PigOldAge INT
)

INSERT INTO #Pig VALUES
('x',5,2,3),
('y',2,9,5),
('z',1,1,8);

WITH Mx_cte
    AS
    (
    SELECT  PigName,
            Age = PigEarlyAge 
    FROM    #Pig
    UNION
    SELECT  PigName,
            Age = PigMiddleAge 
    FROM    #Pig
    UNION
    SELECT  PigName,
            Age = PigOldAge 
    FROM    #Pig
    )
SELECT  x.PigName,
        x.PigEarlyAge,
        x.PigMiddleAge,
        x.PigOldAge,
        y.mx 
FROM    #Pig x
        INNER JOIN 
        (
        SELECT  PigName,
                mx = Max(Age) 
        FROM    Mx_cte
        GROUP BY PigName
        ) y
        ON
            x.PigName = y.PigName
4

3 回答 3

4

SQL Server 没有GREATEST其他 RDBMS 中的等效函数,它接受值列表并返回最大值。

但是,您可以通过使用由所需列组成的表值构造函数来模拟类似的东西,然后将其应用于MAX该列。

SELECT *,
       (SELECT MAX(Age)
        FROM   (VALUES(PigEarlyAge),
                      (PigMiddleAge),
                      (PigOldAge)) V(Age)) AS mx
FROM   #Pig 
于 2013-06-04T22:09:47.297 回答
1

如果你想要三个字段的最大值:

 select (case when max(PigEarlyAge) >= max(PigMiddleAge) and max(PigEarlyAge) >= max(PigOldAge)
              then max(PigEarlyAge)
              when max(PigMiddleAge) >= max(PigOldAge)
              then max(PigMiddleAge)
              else max(PigOldAge)
         end)
  from #Pig

如果您正在寻找具有相应最大值的行,请与以下内容row_number()一起使用union

select p.PigName, PigEarlyAge, PigMiddleAge, PigOldAge,
       (case when PigEarlyAge >= PigMiddleAge and PigEarlyAge >= PigOldAge then PigEarlyAge 
             when PigMiddleAge >= PigOldAge then PigMiddleAge 
             else PigOldAge 
         end) as BigAge
from (select p.*,
             row_number() over 
                   (order by (case when PigEarlyAge >= PigMiddleAge and PigEarlyAge >= PigOldAge then PigEarlyAge 
                                   when PigMiddleAge >= PigOldAge then PigMiddleAge 
                                   else PigOldAge 
                              end) desc
                   ) seqnum as seqnum
      from #Pig p
     ) p
where p.seqnum = 1;

如果您想要重复值,请使用rank()而不是row_number().

于 2013-06-04T21:56:11.497 回答
0

如果您需要组合的最大年龄,您可以简单地将它们添加到 Max 函数中:

SELECT PigName, MAX(PigEarlyAge + PigMiddleAge + PigOldAge) as MaxAge
FROM  #Pig
GROUP BY PigName
于 2013-06-04T21:51:03.980 回答