在新专栏中需要最大的价值

时间:2014-11-10 17:47:41

标签: sql max calculated-columns

所以我有一个看起来像这样的表:

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。

3 个答案:

答案 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