T-SQL 中的行最大值
Row-wise maximum in T-SQL
我有一个包含几列的 table,对于每一行我想要最大值:
-- 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 |
+----+---------+
如果有两列或三列,我会在 iif
或 CASE
语句中写出来。
select ID
, iif(C1 > C2, C1, C2) row_max
from table
但是随着列的增多,这很快就会变得很麻烦。有没有一种很好的方法来获得这个按行的最大值?在 R 中,这称为 "parallel maximum",所以我喜欢
select ID
, pmax(C1, C2, C3, C4) row_max
from table
如何反转数据以获得结果?你说的是 tsql 但不是什么版本的 SQL 服务器。在 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 Fiddle with Demo. Note, this could be abbreviated by using a table value constructor。
这也可以通过 SQL 服务器中的 UNPIVOT 函数来完成:
select id, row_max = max(val)
from yourtable
unpivot
(
val
for col in (C1, C2, C3, C4)
) piv
group by id
参见 SQL Fiddle with Demo。两个版本都给出了结果:
| id | row_max |
|----|---------|
| 1 | 4 |
| 2 | 11 |
| 3 | 4 |
| 4 | 2 |
| 5 | 8 |
您可以使用以下查询:
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
一种方法使用 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
我有一个包含几列的 table,对于每一行我想要最大值:
-- 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 |
+----+---------+
如果有两列或三列,我会在 iif
或 CASE
语句中写出来。
select ID
, iif(C1 > C2, C1, C2) row_max
from table
但是随着列的增多,这很快就会变得很麻烦。有没有一种很好的方法来获得这个按行的最大值?在 R 中,这称为 "parallel maximum",所以我喜欢
select ID
, pmax(C1, C2, C3, C4) row_max
from table
如何反转数据以获得结果?你说的是 tsql 但不是什么版本的 SQL 服务器。在 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 Fiddle with Demo. Note, this could be abbreviated by using a table value constructor。
这也可以通过 SQL 服务器中的 UNPIVOT 函数来完成:
select id, row_max = max(val)
from yourtable
unpivot
(
val
for col in (C1, C2, C3, C4)
) piv
group by id
参见 SQL Fiddle with Demo。两个版本都给出了结果:
| id | row_max |
|----|---------|
| 1 | 4 |
| 2 | 11 |
| 3 | 4 |
| 4 | 2 |
| 5 | 8 |
您可以使用以下查询:
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
一种方法使用 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