我试图在3列中找到最大的行值。我尝试了几种方法,但都失败了。
原始数据:
| max_adsl_predicted_down | max_sfbb_predicted_down | max_ufbb_predicted_down
| 10 | 60 | -1
|
10 | 80 | 350
|
10 | 1 | -1
所需的输出:
| max_download |
| 60 |
| 350 |
| 10 |
数据示例和用于生成它的SQL
Select TOP(379)
max_adsl_predicted_down,
max_sfbb_predicted_down,
max_ufbb_predicted_down
FROM table
15 80 -1
15 80 -1
15 80 -1
15 80 -1
15 80 -1
15 80 -1
10 80 350
10 80 350
使用CASE表达式:
SELECT TOP(379)
CASE WHEN max_ufbb_predicted_down > max_adsl_predicted_down AND max_ufbb_predicted_down > max_sfbb_predicted_down THEN max_ufbb_predicted_down
WHEN max_sfbb_predicted_down > max_adsl_predicted_down AND max_sfbb_predicted_down > max_ufbb_predicted_down THEN max_sfbb_predicted_down
WHEN max_adsl_predicted_down > max_sfbb_predicted_down AND max_adsl_predicted_down > max_ufbb_predicted_down THEN max_adsl_predicted_down
END AS max_download
FROM table
80
80
80
80
80
80
80
80
使用MAX表达式:
SELECT TOP(379)
(SELECT MAX(speeds)
FROM (VALUES (max_ufbb_predicted_down), (max_adsl_predicted_down), (max_sfbb_predicted_down)) as speeds(speeds) )AS max_download
FROM table
80
80
80
80
80
80
80
80
我不明白为什么这些方法没有连续返回最高值。您能否提出解决方案或这些方法无效的原因?
谢谢
答案 0 :(得分:1)
与许多其他数据库一样,SQL Server不支持标量GREATEST
函数。取而代之的是,我们可以使用CASE
表达式:
SELECT
CASE WHEN max_adsl_predicted_down > max_sfbb_predicted_down AND
max_adsl_predicted_down > max_ufbb_predicted_down
THEN max_adsl_predicted_down
WHEN max_sfbb_predicted_down > max_ufbb_predicted_down
THEN max_sfbb_predicted_down
ELSE max_ufbb_predicted_down END AS max_download
FROM yourTable;
三列col1
,col2
和col3
易于理解的一般形式是:
SELECT
CASE WHEN col1 > col2 AND col1 > col3 THEN col1
WHEN col2 > col3 THEN col2
ELSE col3 END AS greatest_col
FROM yourTable;
答案 1 :(得分:0)
除了蒂姆的答案,您可以做的是在子查询中取消数据透视,然后使用MAX
:
SELECT (SELECT MAX(V.ColumnVal)
FROM (VALUES(YT.max_adsl_predicted_down),
(YT.max_sfbb_predicted_down),
(YT.max_ufbb_predicted_down))V(ColumnVal)) AS max_download
FROM dbo.YourTable YT;