2016-11-23 5 views
0

レコードのステータスを含むテーブルがあります。このような何か:レコードの以前のステータスに応じてSQLのケース

ID STATUS TIMESTAMP 
1 I 01-01-2016 
1 A 01-03-2016 
1 P 01-04-2016 
2 I 01-01-2016 
2 P 01-02-2016 
3 P 01-01-2016 

私は、各行の最新バージョンを取り、Iとなっていくつかの点であり、すべてのPのために、彼らは代わりに「G」と同棲しなければならないケースを作りたいです私は

Select case when ID in (select ID from TABLE where ID = 'I') else ID END as  status) 
From TABLE 
where ID in (select max(ID) from TABLE) 

ような何かをしようとするとP.

の私は、これはケーシング時点の使用は不可能であるというエラーが発生します。

私の質問は、どうすればいいのですか?

はで終わるしたい:

ID STATUS TIMESTAMP 
1 G 01-04-2016 
2 G 01-02-2016 
3 P 01-01-2016 

DBMS IBM DB2

+0

私たちは、IBMのDB2のSQLを使用しています、それがDBMSならば? – user2656595

+0

正確なDBMSを指定していません – Viki888

+0

各行に対して?あなたは各IDを意味しますか?ネクタイの場合に期待される結果は何ですか? – jarlh

答えて

0

は、最新のタイムスタンプで各IDを返す派生テーブルを持っています。その結果と参加:

select t1.ID, t1.STATUS, t1.TIMESTAMP 
from tablename t1 
join (select id, max(timestamp) as max_timestamp 
     from tablename 
     group by id) t2 
    ON t1.id = t2.id and t1.TIMESTAMP = t2.max_timestamp 

が同数の場合には(同じ最新のタイムスタンプを持つ2つの行を。)両方の行を返します

注ANSI SQLの予約語としてTIMESTAMPを持っているので、あなたが区切る必要があるかもしれませんそれは"TIMESTAMP"です。

0

これは、共通のテーブル式を使用して、ステータスが'I'であるすべてのIDを見つけて、テーブルで外部結合を使用して、特定の時点でIDが'I'であるかどうかを判断することによって実行できます。

with irecs (ID) as (
    select distinct 
     ID 
    from 
     TABLE 
    where 
     status = 'I' 
), 
ranked as (
    select 
     rownumber() over (partition by t.ID order by t.timestamp desc) as rn, 
     t.id, 
     case when i.id is null then t.status else 'G' end as status, 
     t.timestamp 
    from 
     TABLE t 
     left outer join irecs i 
      on t.id = i.id 
) 
select 
    id, 
    status, 
    timestamp 
from 
    ranked 
where 
    rn = 1; 
0

は、あなたが(これは以下の ranked共通テーブル式に示されている row_number() OLAP機能を使用し、唯一の「最新」のレコードを選択することができます(唯一の最新のレコードに)最終的な結果を取得するにはこの

select distinct f1.id, f4.* 
from yourtable f1 
inner join lateral 
(
    select 
    case (select count(*) from yourtable f3 where f3.ID=f2.ID and f3."TIMESTAMP"<f2."TIMESTAMP" and f3.STATUS='I')>0 then 'G' else f2.STATUS end as STATUS, 
    f2."TIMESTAMP" 
    from yourtable f2 where f2.ID=f3.ID 
    order by f2."TIMESTAMP" desc, rrn(f2) desc 
    fetch first rows only 

) f4 on 1=1 

RRN(F2)の順序が同じ最後の日のために

ANSI SQLの予約語としてTIMESTAMPを持っているので、あなたが旧姓ことをしてみてくださいdは "TIMESTAMP"

0

他の解決策として、それを区切るために

with youtableranked as (
select f1.id, 
case (select count(*) from yourtable f2 where f2.ID=f1.ID and f2."TIMESTAMP"<f1."TIMESTAMP" and f2.STATUS='I')>0 then 'G' else f1.STATUS end as STATUS, 
rownumber() over(partition by f1.id order by f1.TIMESTAMP desc, rrn(f1) desc) rang, 
f1."TIMESTAMP" 
from yourtable f1 
) 
select * from youtableranked f0 
where f0.rang=1 

あなたが "TIMESTAMP" としてそれを区切るために必要がある場合がありますので、ANSI SQLは、予約語としてTIMESTAMPを持つ

関連する問題