2015-12-02 95 views
3

我似乎被卡住了,无法找到解决方案。SQL - 选择连续的最大值

我有一个SQL表谁是第一行看起来是这样的:

Name Val1 Val2 Val3 
John 1000 2000 3000 

我需要做的是选择该行中最大的价值即3000

显然,如果这些值是在一个什么列而不是行,您可以使用SELECT MAX(column) FROM table来获得列中的最大值。 是否有这样的等价物来查找连续的最大值?

我也有过一起来看看PIVOTUNPIVOT的用途,但我不认为他们是我在这里有用..

我已经能够做到这一点的唯一方法是创建一个临时表并插入每个值成一列,像这样:

CREATE TABLE #temp (colvals float) 
    INSERT INTO #temp (colvals) 
      SELECT Val1 FROM table WHERE ID=1 
     UNION 
      SELECT Val2 FROM table WHERE ID=1 
     UNION 
      SELECT Val3 FROM table WHERE ID=1 
-------------------------------------------- 
SELECT MAX(colvals) FROM #temp 
-------------------------------------------- 
DROP TABLE #temp 

不过,我觉得这是相当缓慢尤其是我的表比我上面显示的片段更大量的列。

任何想法?

在此先感谢。

+0

UNION ALL可能更快,但可能不是最好的解决方案。 – jarlh

+1

哪个数据库? – Bohemian

+0

如果你真的有20列,那么你可以搜索内置函数。那失败了,也许你可以创建一个自定义函数。 –

回答

3

您可以通过APPLY构建列的参考表,并使用本地MAX()

-- Sample Data 
declare @data table (Name varchar(10), Val1 int, Val2 int, Val3 int, Val4 int, Val5 int, Val6 int) 
insert @data values 
    ('John', 1000, 2000, 3000, 4000, 5000, 6000), 
    ('Mary', 1, 2, 3, 4, 5, 6) 


select Name, MaxValue from 
    @data 
    cross apply 
    (
     select max(value) as MaxValue 
     from 
      (values 
       (Val1),(Val2),(Val3),(Val4),(Val5),(Val6) -- Append here 
      ) t(value) 
    ) result 

SQL Fiddle

+0

这对我很好。谢谢。 – Johnathan

1
select MAX(case when c1 > c2 and c1 > c3 then c1 
       when c2 > c3 then c2 
       else c3 
      end) 
from tablename 
+0

这肯定会起作用,但是我的表有20多列,所以这个查询会变得非常漫长和混乱,可能效率不高。 – Johnathan

+0

@Johnathan,有很多专栏我会用另一个解决方案。 – jarlh

1

你需要的东西是这样的:

SELECT *, Row_Number() OVER (ORDER BY GETDATE()) Rowid INTO #temp From yourtable 

DECLARE @Columns AS Varchar(MAX) 
SET @Columns ='' 
SELECT @Columns = @Columns + ',[' + name + ']' FROM tempdb..syscolumns 
WHERE id=object_id('tempdb..#temp') AND name <> 'Rowid' 

SELECT @Columns = Right(@Columns, len(@Columns)-1) 
exec ('Select Rowid,Max(val) maxval from #temp t Unpivot(val For data in (' + @Columns + ')) as Upvt Group by Rid') 

Drop table #temp 
0

使用数学逻辑:

select 
    case 
    when val1 >= val2 and val1 >= val2 then val1 
    when val2 >= val1 and val2 >= val3 then val2 
    else val3 
    end maxVal 
from mytable 
where id = 1 
1

我认为当你将unpivot看作是一个选项时,你是处于正确的轨道上的。 Becaue这正是你想要做的 - 你有一个数据透视表,并且你想从它得到未知值。以下是我想出了:

declare @base table (Name char(4), Val1 int, Val2 int ,Val3 int); 
insert into @base (Name, Val1 , Val2 , Val3) values ('John' , 1000 , 2000 , 3000); 

select name, max(value) as max_value 
from (
    select name, valuetype, value 
    from @base b 
    unpivot (value for valuetype in (Val1 , Val2 , Val3)) as u 
    ) as up 
group by name 

扩大到你的整个表,你就可以只需添加更多的列名的逆转置行:

unpivot (value for valuetype in (Val1 , Val2 , Val3, ... more values here...)) as u 
0

你总是可以复制这个答案Is there a Max function in SQL Server that takes two values like Math.Max in .NET?

-- Sample Data 
declare @data table (Name varchar(10), Val1 int, Val2 int, Val3 int, Val4 int, Val5 int, Val6 int) 
insert @data values 
    ('John', 1000, 2000, 3000, 4000, 5000, 6000), 
    ('Mary', 1, 2, 3, 4, 5, 6), 
    ('Tony66', 1, 2, 3, 4, 5, 66), 
    ('Tony55', 1, 2, 3, 4, 55, 6), 
    ('Tony44', 1, 2, 3, 44, 5, 6), 
    ('Tony33', 1, 2, 33, 4, 5, 6), 
    ('Tony22', 1, 22, 3, 4, 5, 6), 
    ('Tony11', 11, 2, 3, 4, 5, 6) 

SELECT name, 
     (SELECT MAX(value) 
     FROM (VALUES (Val1),(Val2), (Val3), (Val4), (Val5), (Val6)) AS AllValues(value)) AS 'MaxValue' 
FROM @data