当前位置: 代码迷 >> Sql Server >> sql:取最大值,该如何解决
  详细解决方案

sql:取最大值,该如何解决

热度:73   发布时间:2016-04-24 20:05:12.0
sql:取最大值
需求:同一行数据取得最大值
测试的数据如下:

create table testmax(city varchar(100),date datetime,num1 float,num2 float,num3 float,num4 float)
insert into testmax values('广州市','2013-10-01',1.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-02',1,2,3,4)
insert into testmax values('广州市','2013-10-03',140.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-04',1.3,45.0,9,30.05)


需要的结果如下:
city date                      max_num
广州市 2013-10-01 00:00:00.000   45.0
广州市 2013-10-02 00:00:00.000   4
广州市 2013-10-03 00:00:00.000   140.3
广州市 2013-10-04 00:00:00.000   45.0

各路神人路过求指导
sql 语法

------解决方案--------------------
那就换个方法试试:


create table testmax(city varchar(100),date datetime,num1 float,num2 float,num3 float,num4 float)
insert into testmax values('广州市','2013-10-01',1.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-02',1,2,3,4)
insert into testmax values('广州市','2013-10-03',140.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-04',1.3,45.0,9,30.05)

select city,[date],max_num=case when max_num1>max_num2 then max_num1 else max_num2 end
from 
(select city,[date],max_num1=case when num1>num2 then num1 else num2 end
,max_num2=case when num3>num4 then num3 else num4 end
from testmax
)t


/*
city date max_num
广州市 2013-10-01 00:00:00.000 45
广州市 2013-10-02 00:00:00.000 4
广州市 2013-10-03 00:00:00.000 140.3
广州市 2013-10-04 00:00:00.000 45
*/

------解决方案--------------------
引用:
Quote: 引用:

那就换个方法试试:


create table testmax(city varchar(100),date datetime,num1 float,num2 float,num3 float,num4 float)
insert into testmax values('广州市','2013-10-01',1.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-02',1,2,3,4)
insert into testmax values('广州市','2013-10-03',140.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-04',1.3,45.0,9,30.05)

select city,[date],max_num=case when max_num1>max_num2 then max_num1 else max_num2 end
from 
(select city,[date],max_num1=case when num1>num2 then num1 else num2 end
,max_num2=case when num3>num4 then num3 else num4 end
from testmax
)t


/*
city date max_num
广州市 2013-10-01 00:00:00.000 45
广州市 2013-10-02 00:00:00.000 4
广州市 2013-10-03 00:00:00.000 140.3
广州市 2013-10-04 00:00:00.000 45
*/
如果有十几个num。。。。


写函数与是得一一比较,基本上只能用这个方法,如果再多就再加一层子查询.
感觉是比union all方法要好一些。
------解决方案--------------------
引用:
Quote: 引用:


select city,[date],MAX(num) max_num
from (
select city,[date],num1 num
from testmax 
union all
select city,[date],num2 num
from testmax
union all
select city,[date],num3 num
from testmax
union all
select city,[date],num4 num
from testmax
) t
group by city,[date]
有其他思路吗?



create table testmax(city varchar(100),date datetime,num1 float,num2 float,num3 float,num4 float)
insert into testmax values('广州市','2013-10-01',1.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-02',1,2,3,4)
insert into testmax values('广州市','2013-10-03',140.3,45.0,2.4,30.05)
insert into testmax values('广州市','2013-10-04',1.3,45.0,9,30.05)

go
create function fn_getmax(@num1 float,@num2 float,@num3 float,@num4 float)
returns float
as
begin
return 
(
select MAX(num) 
from (
select @num1 as num
union all 
select @num2
union all 
select @num3
  相关解决方案