继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

在一个SQL Server表中的多个列找出最大值

所谓伊人_在水一方
关注TA
已关注
手记 273
粉丝 23
获赞 169

有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示

这里给出一个例子

复制代码

IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL)    DROP TABLE ##TestTableCREATE TABLE ##TestTable(    ID INT IDENTITY(1,1) PRIMARY KEY,    Name NVARCHAR(40),    UpdateByApp1Date DATETIME,    UpdateByApp2Date DATETIME,    UpdateByApp3Date DATETIME)INSERT INTO ##TestTable(Name, UpdateByApp1Date, UpdateByApp2Date, UpdateByApp3Date )VALUES('ABC', '2015-08-05','2015-08-04', '2015-08-06'),      ('NewCopmany', '2014-07-05','2012-12-09', '2015-08-14'),      ('MyCompany', '2015-03-05','2015-01-14', '2015-07-26')      SELECT * FROM ##TestTable

复制代码

结果如下所示

 

 

有三种方法可以实现

方法一

复制代码

SELECT  ID ,        Name ,        ( SELECT    MAX(LastUpdateDate)          FROM      ( VALUES ( UpdateByApp1Date), ( UpdateByApp2Date),                    ( UpdateByApp3Date) ) AS UpdateDate ( LastUpdateDate )          ) AS LastUpdateDateFROM    ##TestTable

复制代码

 

 

方法二

复制代码

SELECT  ID ,        [Name] ,        MAX(UpdateDate) AS LastUpdateDateFROM    ##TestTable UNPIVOT ( UpdateDate FOR DateVal IN ( UpdateByApp1Date,                                                          UpdateByApp2Date,                                                          UpdateByApp3Date ) ) AS uGROUP BY ID ,        Name

复制代码

 

 

方法三

复制代码

SELECT  ID ,        name ,        ( SELECT    MAX(UpdateDate) AS LastUpdateDate          FROM      ( SELECT    tt.UpdateByApp1Date AS UpdateDate                      UNION                      SELECT    tt.UpdateByApp2Date                      UNION                      SELECT    tt.UpdateByApp3Date                    ) ud        ) LastUpdateDateFROM    ##TestTable tt

复制代码

 

第一种方法使用values子句,将每行数据构造为只有一个字段的表,以后求最大值,非常巧妙

第二种方法使用行转列经常用的UNPIVOT 关键字进行转换再显示

第三种方法跟第一种方法差不多,但是使用union将三个UpdateByAppDate字段合并为只有一个字段的结果集然后求最大值

 

第一种方法的执行计划

 

第二种方法的执行计划

 

第三种方法的执行计划

 

 

总的来说,第一种方法的执行计划是最好的

 

注意,这里不涉及分组

复制代码

IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL)    DROP TABLE ##TestTableCREATE TABLE ##TestTable    (      ID INT IDENTITY(1, 1)             PRIMARY KEY ,      Name NVARCHAR(40) ,      UpdateByApp1Date DATETIME ,      UpdateByApp2Date DATETIME ,      UpdateByApp3Date DATETIME    )INSERT  INTO ##TestTable        ( Name, UpdateByApp1Date, UpdateByApp2Date, UpdateByApp3Date )VALUES  ( 'ABC', '2015-08-05', '2015-08-04', '2015-08-06' ),        ( 'ABC', '2015-07-05', '2015-06-04', '2015-09-06' ),        ( 'NewCopmany', '2014-07-05', '2012-12-09', '2015-08-14' ),        ( 'MyCompany', '2015-03-05', '2015-01-14', '2015-07-26' )      SELECT  *FROM    ##TestTableSELECT  ID ,        Name ,        ( SELECT    MAX(LastUpdateDate)          FROM      ( VALUES ( UpdateByApp1Date), ( UpdateByApp2Date),                    ( UpdateByApp3Date) ) AS UpdateDate ( LastUpdateDate )          ) AS LastUpdateDateFROM    ##TestTable

复制代码

name列相同的话,是无法得出name分组之后的最大值,这里要注意一下

 

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP