T-SQL中的行最大值

Gre*_*gor 1 sql t-sql unpivot

我有一个包含几列的表,并且对于每行我想要最大值:

-- 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 |
+----+---------+
Run Code Online (Sandbox Code Playgroud)

有两三列,我只是写出来iifCASE声明.

select ID
  , iif(C1 > C2, C1, C2) row_max
from table
Run Code Online (Sandbox Code Playgroud)

但是随着更多的列,这会变得很麻烦.有没有一个很好的方法来获得这个行最大值?在R中,这称为"平行最大值",所以我喜欢类似的东西

select ID
  , pmax(C1, C2, C3, C4) row_max
from table
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 8

如何取消数据以获得结果呢?你说过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
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo.注意,这可以通过使用表值构造函数来缩写.

这也可以通过SQL Server中的UNPIVOT函数来完成:

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

请参阅SQL Fiddle with Demo.两个版本都给出了结果:

| id | row_max |
|----|---------|
|  1 |       4 |
|  2 |      11 |
|  3 |       4 |
|  4 |       2 |
|  5 |       8 |
Run Code Online (Sandbox Code Playgroud)


Gio*_*sos 6

您可以使用以下查询:

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
Run Code Online (Sandbox Code Playgroud)

SQL小提琴演示