2017-02-11 97 views
1

我的SQL Server表具有相同的行200個日期:SQL Server的最大值和最小值日行

ID Date1 Data2 Date3 (..) Date200 

是否有可能找到一個行的最小值和最大值的日期?

由於

+0

你的意思是這樣SELECT MAX( Date1)FROM Table或SELECT MIN(Date1)FROM Table? – Fendec

+0

您正在使用哪種RDMS –

回答

0

的一種方法是使用一個CROSS APPLY到UNPIVOT的行。 無需列出200個日期列(請注意attr.value('local-name(.)','varchar(100)') Like 'Date%')。

您可能還會注意到NULL將被忽略。

Declare @YourTable table (ID int,Date1 date,Date2 date,Date3 date) 
Insert into @YourTable values 
(1,'2016-01-01','2016-01-15','2016-02-01'), 
(2,'2016-02-15',null,null) 

Select A.ID 
     ,C.* 
From @YourTable A 
Cross Apply (Select XMLData=cast((Select A.* For XML RAW) as xml)) B 
Cross Apply (
      Select MinDate = min(Value) 
        ,MaxDate = max(Value) 
       From (
         Select Value = attr.value('.','date') 
         From B.XMLData.nodes('/row') as A(r) 
         Cross Apply A.r.nodes('./@*') AS B(attr) 
         Where attr.value('local-name(.)','varchar(100)') Like 'Date%' 
         ) S 
      ) C 

返回

ID MinDate  MaxDate 
1 2016-01-01 2016-02-01 
2 2016-02-15 2016-02-15 

編輯 - 另一種選擇

Select A.ID 
     ,C.* 
From @YourTable A 
Cross Apply (
      Select MinDate = min(Value) 
        ,MaxDate = max(Value) 
       From (values (A.Date1) 
           ,(A.Date2) 
           ,(A.Date3) 
           -- .. More Columns 
         ) C1 (Value) 
      ) C 
相關問題