按行最大的T-SQL [复制](Row-wise maximum in T-SQL [duplica

2019-10-22 16:26发布

这个问题已经在这里有一个答案:

  • 多列的SQL MAX? 22个回答

我有一个表有几列,每一行我想最大:

-- Table:
+----+----+----+----+----+
| ID | C1 | C2 | C3 | C4 |
+----+----+----+----+----+
|  1 |  1 |  2 |  3 |  4 |
|  2 | 11 | 10 | 11 |  9 |
|  3 |  3 |  1 |  4 |  1 |
|  4 |  0 |  2 |  1 |  0 |
|  5 |  2 |  7 |  1 |  8 |
+----+----+----+----+----+


-- Desired result:
+----+---------+
| ID | row_max |
+----+---------+
|  1 |       4 |
|  2 |      11 |
|  3 |       4 |
|  4 |       2 |
|  5 |       8 |
+----+---------+

两个或三个栏,我只是写出来的iifCASE语句。

select ID
  , iif(C1 > C2, C1, C2) row_max
from table

但是随着越来越多列这得到繁琐快。 有一个很好的方式来获得该行明智最大? 在R,这就是所谓的“平行最大”,所以我很乐意像

select ID
  , pmax(C1, C2, C3, C4) row_max
from table

Answer 1:

什么unpivoting的数据得到的结果? 你曾说过TSQL但是不知道SQL Server的版本。 在SQL Server 2005 +,你可以使用CROSS APPLY来列转换为行,然后得到每一行的最大值:

select id, row_max = max(val)
from yourtable
cross apply
(
  select c1 union all
  select c2 union all
  select c3 union all
  select c4
) c (val)
group by id

请参阅SQL拨弄演示 。 请注意,这可以通过使用缩写表值构造 。

这也可以通过完成UNPIVOT在SQL Server的功能:

select id, row_max = max(val)
from yourtable
unpivot
(
  val
  for col in (C1, C2, C3, C4)
) piv
group by id

请参阅SQL拨弄演示 。 两个版本都给出了结果:

| id | row_max |
|----|---------|
|  1 |       4 |
|  2 |      11 |
|  3 |       4 |
|  4 |       2 |
|  5 |       8 |


Answer 2:

您可以使用下面的查询:

SELECT id, (SELECT MAX(c) 
            FROM (
                SELECT c = C1
                UNION ALL
                SELECT c = C2
                UNION ALL
                SELECT c = C3
                UNION ALL
                SELECT c = C4
            ) as x(c)) maxC
FROM mytable

SQL小提琴演示



Answer 3:

一种方法是使用cross apply

select t.id, m.maxval
from table t cross apply
     (select max(val) as maxval
      from (values (c1), (c2), (c3), (c4)) v(val)
     ) m


文章来源: Row-wise maximum in T-SQL [duplicate]
标签: sql tsql unpivot