2009-04-08 1 views
0

異なる日付の4列の表があります。テーブル内のさまざまな列から最大日付の列名を選択

最大の日付の列名を取得する必要があります。どのようにそれについて行くためにどのように役立つことができますか?

+0

:これは、MySQLの関数の構文では、あなたのDBは異なる構文を使用して、代わりに値を返すの変数をOUT使用することです1列の最大日付は1つだけですか? – TStamper

+0

あなたの説明はあいまいです。行の最新の日付を持つ列の名前、または最新の日付の行が必要ですか? – tpdi

+0

あなたはどのデータベースプラットフォームを使用していますか?質問には、OracleとSQL Serverの両方でタグが付けられます。 –

答えて

0

私はあまりOracleに慣れていないので、SQL Server固有のアプローチ(サンプル用の変数以外)を避けていますが、問題を解決する方法は、4つの列を結合するサブクエリを作成する方法です列名、4つの値の最大値を取得する別のサブクエリ、および結合された結果を返す外部クエリをマップします。 、行識別子によってグループに集約サブクエリを修正し、その後同様に

Declare @x table(id int 
, date1 datetime 
, date2 datetime 
, date3 datetime 
, date4 datetime) 

insert into @x 
values (1, '01/01/2000' 
, '01/01/2001' 
, '01/01/2002', '01/01/2004') 

insert into @x 
values (2, '01/01/2010' 
, '01/01/2020' 
, '01/01/2030', '01/01/2040') 


Select SomeDate, ColumnName 
from 
(
Select date1 as somedate 
, 'Date 1' as ColumnName from @x 
union 
Select date2 as somedate 
, 'Date 2' as ColumnName from @x 
union 
Select date3 as somedate 
, 'Date 3' as ColumnName from @x 
union 
Select date4 as somedate 
, 'Date 4' as ColumnName from @x 
) t1 
inner join 
(
    Select max(tx.somedate) MaxDate from 
    (
     Select date1 as somedate from @x 
     union 
     Select date2 as somedate from @x 
     union 
     Select date3 as somedate from @x 
     union 
     Select date4 as somedate from @x 
    ) as tx 
) t2 
on t1.SomeDate = t2.MaxDate 
1

場合、そのカラムに結合することによって、行の最大にサンプルを、以下の表の最大を返すであろうが、これは調整することができます私は、列名を望んでいた(と私はそれをしたいと思う理由は私にはわからない場合は

select case when dt1 > d2 then dt1 else dt2 end as latest from table; 

:行ごとに、私はcase文を使用すると思い、2つの日付の列で最新の日付を望んでいました):

select case when dt1 > d2 then 'dt1' else 'dt2' end as latest from table; 

私は複数の列に対処したい場合は、私が巣よりcase文たい:

select case when dt1 > d2 then 
    (case when dt1 > dt3 then dt1 else dt3 end) 
    else 
    (case when dt2 > dt3 then dt2 else dt3 end) 
    end as latest 
from table; 

または、より良いが、私はこのようにそれを行うことができます:(多分良い)

select case 
    when dt1 > d2 and dt1 > dt3 then dt1 
    when dt2 > d1 and dt2 > dt3 then dt2 
    else dt3 end as latest 
from table ; 

それとも私があります関数を書く。 maxは組み込み関数なので、maxOfという名前を書いておきます。 、

create function maxOf(date lhs, date rhs) 
    RETURNS date 
    LANGUAGE SQL 
    DETERMINISTIC 
    CONTAINS SQL 
    COMMENT 'return the later of two dates' 
    return case when lhs > rhs then lhs else rhs end; 


select maxOf(dt1, maxOf(dt2, dt3) as latest from table; 
0

OracleはGREATESTあり、LEAST

あなたのカラム名が何であるか
SELECT GREATEST (TO_DATE ('01-01-2000', 'DD-MM-YYYY'), TO_DATE ('01-01-2010', 'DD-MM-YYYY')) FROM DUAL; 

SELECT LEAST (TO_DATE ('01-01-2000', 'DD-MM-YYYY'), TO_DATE ('01-01-2010', 'DD-MM-YYYY')) FROM DUAL; 
関連する問題