所以我有一个看起来像这样的表:
ID amt_1 amt_2 amt_3 amt_4
001 100.00 300.00 50.00 200.00
002 200.00 400.00 100.00 200.00
003 700.00 50.0 200.00 700.00
我想创建一个新的列,每个ID只带有最大价值,即:
ID amt_1 amt_2 amt_3 amt_4 NEW_COL
001 100.00 300.00 50.00 200.00 300.00
002 200.00 400.00 100.00 200.00 400.00
003 700.00 50.0 200.00 700.00 700.00
并不是说我认为CTE会对我有所帮助,但是让我说我不能使用它们,因为这是导入到Tableau的,它无法识别CTE。
答案 0 :(得分:1)
使用CASE Statement
,您可以找到列中的最大值。
SELECT ID,
amt_1,
amt_2,
amt_3,
amt_4,
CASE
WHEN amt_1 >= amt_2 AND amt_1 >= amt_3 AND amt_1 >= amt_4 THEN amt_1
WHEN amt_2 >= amt_1 AND amt_2 >= amt_3 AND amt_2 >= amt_4 THEN amt_2
WHEN amt_3 >= amt_1 AND amt_3 >= amt_2 AND amt_3 >= amt_4 THEN amt_3
WHEN amt_4 >= amt_1 AND amt_4 >= amt_2 AND amt_4 >= amt_3 THEN amt_4
END NEW_COL
FROM Tablename
如果您使用的是SQL SERVER 2008 or later versions
,请尝试使用
SELECT ID,amt_1,amt_2,amt_3,amt_4,
(SELECT Max(amt) FROM (VALUES (amt_1), (amt_2), (amt_3),(amt_4)) AS value(amt)) NEW_COL
FROM tablename
答案 1 :(得分:0)
使用SQL,您可以使用subselect执行以下操作:
SELECT MAX(SELECT amt_1 FROM table_name
UNION
SELECT amt_2 FROM table_name
UNION
SELECT amt_3 FROM table_name
// ...) as maxValue, id FROM table_name
我只是在大声思考,试着看看这个伪代码是否有效,请注意你可以创建一个视图或一个临时表来存储从4个选择的Union返回的表。
古德勒克
答案 2 :(得分:0)
如果您在子查询中使用一组联合来选择每个amt_#
值,然后从中选择每个id的最大值(按ID
分组),它应该可以满足您的需求:
select
mt.ID,
mt.amt_1,
mt.amt_2,
mt.amt_3,
mt.amt_4,
max(amt)
from (
select
ID,
amt_1 as amt
from MyTable
Union
select
ID,
amt_2
from MyTable
Union
select
ID,
amt_3
from MyTable
Union
select
ID,
amt_4
from MyTable
) t1
inner join MyTable mt on t1.id = mt.ID
group by mt.ID, amt_1, amt_2, amt_3, amt_4