在一个SQL Server表中的多个列找出最大值
在一个SQL Server表中一行的多个列找出最大值
有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示
这里给出一个例子
IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL)
DROP TABLE ##TestTable
CREATE 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 LastUpdateDate
FROM ##TestTable
方法二
SELECT ID ,
[Name] ,
MAX(UpdateDate) AS LastUpdateDate
FROM ##TestTable UNPIVOT ( UpdateDate FOR DateVal IN ( UpdateByApp1Date,
UpdateByApp2Date,
UpdateByApp3Date ) ) AS u
GROUP 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
) LastUpdateDate
FROM ##TestTable tt
第一种方法使用values子句,将每行数据构造为只有一个字段的表,以后求最大值,非常巧妙
第二种方法使用行转列经常用的UNPIVOT 关键字进行转换再显示
第三种方法跟第一种方法差不多,但是使用union将三个UpdateByAppDate字段合并为只有一个字段的结果集然后求最大值
第一种方法的执行计划

第二种方法的执行计划

第三种方法的执行计划

总的来说,第一种方法的执行计划是最好的
注意,这里不涉及分组
IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL)
DROP TABLE ##TestTable
CREATE 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 ##TestTable
SELECT ID ,
Name ,
( SELECT MAX(LastUpdateDate)
FROM ( VALUES ( UpdateByApp1Date), ( UpdateByApp2Date),
( UpdateByApp3Date) ) AS UpdateDate ( LastUpdateDate )
) AS LastUpdateDate
FROM ##TestTable

name列相同的话,是无法得出name分组之后的最大值,这里要注意一下
转载自:https://www.mssqltips.com/sqlservertip/4067/find-max-value-from-multiple-columns-in-a-sql-server-table/
在一个SQL Server表中的多个列找出最大值的更多相关文章
- 在一个SQL Server表中一行的多个列找出最大值
有时候我们需要从多个相同的列里(这些列的数据类型相同)找出最大的那个值,并显示 这里给出一个例子 IF (OBJECT_ID('tempdb..##TestTable') IS NOT NULL) D ...
- SQL server 表中如何创建索引?
SQL server 表中如何创建索引?看个示例,你就会了 use master goif db_id(N'zhangxu')is not nulldrop database zhangxugocre ...
- SQL将一个表中的某一列值全部插入到另一个表中
1. SQL将一个表中的某一列值全部插入到另一个表中 插入的话: insert into a(col) select col from b; 更新的话: update a set col=selec ...
- SQL Server:把CSV文件导入到SQL Server表中
有时候我们可能会把CSV中的数据导入到某个数据库的表中,比如做报表分析的时候. 对于这个问题,我想一点也难不倒程序人员吧!但是要是SQL Server能够完成这个任务,岂不是更好! 对,SQL Ser ...
- 为SQL Server表中的列添加/修改/删除注释属性(sp_addextendedproperty、sp_updateextendedproperty、sp_dropextendedproperty)
本篇基本完全参考:sql--sp_addextendedproperty和sp_updateextendedproperty (Transact-SQL) 三个存储过程用法一样,以sp_addexte ...
- 把CSV文件导入到SQL Server表中
保存数据库数据直接查询select * from tableName 在数据表格的左上角右击——将结果另存为选择路劲保存好的就是.csv格式的数据 有时候我们可能会把CSV中的数据导入到某个数据库的表 ...
- 如何删除 SQL Server 表中的重复行
第一种:有主键的重复行,就是说主键不重复,但是记录的内容重复比如人员表tab ,主键列id,身份证编号idcard当身份证重复的时候,保留最小id值的记录,其他删除delete a from tab ...
- 导出 SQL SERVER 表中数据为脚本
ALTER PROCEDURE [dbo].[Usp_OutputData] @tablename sysname, @outputIdentitycolumn int AS declare @col ...
- 从Sql Server表中随机获取一些记录最简单的方法
* FROM test ORDER BY NewID() 注意,使用时,请将‘test’改为真实的表名.
随机推荐
- python之路:Day01 --- Python基础1
本节内容 1.Python介绍 2.发展史 3.变量 4.用户输入 5.表达式 if...else语句 6.表达式 for 循环 7.表达式 while 循环 8.模块初识 9.数据类型初识 10.数 ...
- locate 最快的查找文件的命令 NB
我见过最NB的查找文件最快的命令 [root@NB data]# locate teamviewer. /data/Software/teamviewer.i686.rpm /home/ok/.loc ...
- ble示例代码
ble代码下载: https://github.com/sutogan4ik/Android-BLE-GATT-Master-Slave
- ****基于H5的微信支付开发详解[转]
这次总结一下用户在微信内打开网页时,可以调用微信支付完成下单功能的模块开发,也就是在微信内的H5页面通过jsApi接口实现支付功能.当然了,微信官网上的微信支付开发文档也讲解的很详细,并且有实现代码可 ...
- ***Linux下使用git命令及github项目
在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen ##一直默认就可以了 3.将公钥加入到Github账户 ...
- YUV格式介绍
原文链接:http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html YUV格式有两大类:planar和packed.对于plana ...
- linux 常用命令
//创建目录mkdir//创建中间没有路径的文件夹mkdir -p //删除文件rm//强制删除文件rm -f//删除目录rmdir//删除多个目录rmdir -p //输出当前环境根路径echo $ ...
- Beta工作比例(Transcend)
Beta工作比例 成员 工作 黄志明 10% 洪志兴 10% 李佳恺 17 % 巫振格 17 % 肖承志 10 % 李严 16 % 牛妍辉 stripes 20%
- How to configure security of ActiveMQ ?
Terms {activemq.home}: The ActiveMQ installation folder. How to configure ActiveMQ to use JAAS Authe ...
- UGUI研究院之控件以及按钮的监听事件系统
继续学习,我相信大家在做NGUI开发的时候处理事件都会用到UIEventListener,那么UGUI中怎么办呢?先看UGUI的事件有那些吧 Supported Events The Eventsys ...