2009-01-14 6 views
3

En SQL/Transact SQL, j'essaie de mettre à jour une table temporaire pour prendre la dernière date à partir de 3 colonnes de date différentes (dans cette table temporaire) et mettre cette date MAX dans une colonne "date la plus récente".SQL/T-SQL - comment obtenir la valeur MAX à partir de 1 des N colonnes?

Quelle est la meilleure façon de le faire, en utilisant une instruction de mise à jour?

+1

double possible de http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns –

Répondre

6

Avec seulement trois, ce n'est pas si difficile ... Ce n'est certainement pas extensible à un nombre arbitraire de colonnes datetime!

Select Case When DT1 > DT2 And DT1 > DT3 Then DT1 
      When DT2 > Dt3 Then Dt2 Else DT3 End 
From TableName 
+0

il ne fonctionne pas avec NULLs bien, si prudent. .. – mishkin

4

Je pense que vous devez normaliser votre base de données

RecordID, Column1, Colonne2, Colonne3

à

RecordID, ColumnID, Valeur

Ensuite, vous serez en mesure de trouver la valeur maximale dans les trois colonnes facilement ...

0

Vous pouvez utiliser 3 instructions 'If', en commençant par la première date. Ensuite, après la 3ème instruction 'If', vous saurez quelle est la date la plus élevée (max) ...

Puis stocker cela dans une variable et travailler à partir de là.

1
SELECT 
(CASE WHEN field_1 > field_2 THEN 
    CASE WHEN field_1 > field_3 THEN field_1 ELSE field_3 END 
ELSE 
    CASE WHEN field_2 > field_3 THEN field_2 ELSE field_3 END 
END) AS maximum_date 
FROM table 
2

Peut-être un syndicat?

select max(myDate) 
from (
    select field_1 myDate from myTable where ... 
    union all 
    select field_2 myDate from myTable where ... 
    union all 
    select field_3 myDate from myTable where ... 
) d 

Bien sûr, cela frappe la table trois fois pour la même ligne. Un CTE résoudrait probablement que:

with myRow as (
    select field_1, field_2, field_3 from myTable where ... 
) 
select max(myDate) 
from (
    select field_1 myDate from myRow 
    union all 
    select field_2 myDate from myRow 
    union all 
    select field_3 myDate from myRow 
) d 
Questions connexes