2015-12-21 8 views
5

Sembra che dovrebbe essere facile. Come faccio ad avere l'ultima delle 3 date che sono diverse colonneIn SQL Server, come ottengo le ultime date con più colonne di date?

DROP TABLE #dates 
CREATE TABLE #dates (mykey CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME) 
INSERT #dates VALUES ('Key1', '1/1/2015', '2/1/2015', '3/1/2105') 
INSERT #dates VALUES ('Key2', '1/2/2015', '4/2/2015', '3/2/2105') 
INSERT #dates VALUES ('Key3', '1/3/2016', '4/3/2015', '3/3/2105') 

select mykey, ?? AS 'Latest Date' from #dates 

vorrei che il risultato sia:

mykey  Latest Date 
Key1  2105-03-01 00:00:00.000 
Key2  2015-04-02 00:00:00.000 
Key3  2016-01-03 00:00:00.000 
+0

si può facilmente ottenere utilizzando 'max' dalla tabella derivata basata su' UNION ALL/VALUES' più colonne – lad2025

+0

ho riaperto la questione perché Penso che la risposta qui sotto sia migliore della domanda duplicata di riferimento. –

+1

data3 dovrebbe essere anche nel 2015, non nel 2105 per ottenere i risultati desiderati, altrimenti restituirà la data3 per tutti i tasti – MazBros

risposta

8

Probabilmente il modo più semplice in SQL Server è quello di utilizzare cross apply:

select d.*, m.maxdate 
from #dates d cross apply 
    (select max(dte) as maxdate 
     from (values (date1), (date2), (date3)) as v(dte) 
    ) m; 
+1

anche se è una buona query non fornisce il risultato esatto come indicato nell'output – mohan111

+0

@ mohan111. . . Presumibilmente, l'anno 2105 è un refuso nei dati di esempio, basato sul contesto della domanda. Ecco un SQL Fiddle: http://www.sqlfiddle.com/#!6/a52e6/2. –

+0

No Esattamente, abbiamo bisogno di ottenere il 2016 per key3 ma nella tua query mostra altro valore che dobbiamo MAX indica la data più alta – mohan111

0

Utilizzare una dichiarazione CASE per completare il lavoro.

DECLARE @dates TABLE (mykey CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME) 
INSERT @dates VALUES ('Key1', '1/1/2015', '2/1/2015', '3/1/2105') 
INSERT @dates VALUES ('Key2', '1/2/2015', '4/2/2015', '3/2/2105') 
INSERT @dates VALUES ('Key3', '1/3/2016', '4/3/2015', '3/3/2105') 

select mykey, 
case when date1 >= date2 and date1 >= date3 THEN date1 
    when date2 >= date1 and date2 >= date3 then date2 
    else date3 end [LatestDate] 
from @dates 
0

Qui si può utilizzare iif dichiarazione:

SELECT mykey 
    ,iif(month(date1) > month(date2), iif(month(date1) > month(date3), date1, date3), iif(month(date2) > month(date3), date2, date3)) AS result 
FROM #dates