天天看點

SQL Server表中一行的多個列找出最大值

  有時候我們需要從多個相同的列裡(這些列的資料類型相同)找出最大的那個值,并顯示   這裡給出一個例子 ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

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

SQL Server表中一行的多個列找出最大值

  有三種方法可以實作   方法一   ?

1 2 3 4 5 6 7

SELECT  ID ,

Name ,

( SELECT    MAX(LastUpdateDate)

FROM      ( VALUES ( UpdateByApp1Date), ( UpdateByApp2Date),

( UpdateByApp3Date) ) AS UpdateDate ( LastUpdateDate )

) AS LastUpdateDate

FROM    ##TestTable

方法二   ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

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字段合并為隻有一個字段的結果集然後求最大值   第一種方法的執行計劃

SQL Server表中一行的多個列找出最大值

第二種方法的執行計劃

SQL Server表中一行的多個列找出最大值

第三種方法的執行計劃

SQL Server表中一行的多個列找出最大值

總的來說,第一種方法的執行計劃是最好的   注意,這裡不涉及分組 ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30

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分組之後的最大值,這裡要注意一下

SQL Server表中一行的多個列找出最大值

http://www.2cto.com/database/201510/447166.html

繼續閱讀