2016-05-10 13 views
0

私はuser_versionsというテーブルを持っています。この表には要件のためにID列はありません。ユーザーが詳細を更新すると、新しいバージョンが作成され、バージョンと呼ばれる列が1つ増え、もう一方のバージョンはもうライブではなく、再び保持されます。これは要件によるもので、新しいバージョンがライブになります。同じテーブルの列の値に基づいてレコードを選択する必要があります。

**My Problem** 
Simple example 

user_versions 
------------ 
user_id|name|email|version 
1|John|[email protected]|1 
1|John|[email protected]|2 
1|John|[email protected]|3 
1|John|[email protected]|4 
2|Peter|[email protected]|1 
2|Peter|[email protected]|2 
2|Peter|[email protected]|3 

Needed Results!!! 
------------ 
1|John|[email protected]|4 
2|Peter|[email protected]|3 

私はどのようにすればよいのですか?私はたくさんのものを試してみて、それを理解することはできません。私は2つの別々のクエリでそれを行うことができますが、私は1つのクエリで必要なものを返すことができたら本当に感謝します。

助けを借りていただければ幸いです。標準の構文で

答えて

1

それは次のようになります。

select uv.* 
from user_versions uv 
inner join(select user_id, max(version) as version 
      from user_versions 
      group by user_id) as t 
    on uv.user_id = t.user_id and 
     uv.version = t.version 
+0

それをシンプルに保つあなたがこの簡単かつ偉大が従っていありがとう。 –

1
with cte as 
(
select user_id,name,email,version, row_number() over (partition by user_id order by version desc) as rn 
from 
user_versions) 
select user_id,name, email, version from cte 
where rn = 1 
0

SELECT user_id,name,email,max(version) 

FROM user_versions.tt 
group by user_id,name,email 
0
SELECT user_id, name, email, version 
FROM (
     SELECT user_id, name, email, version, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY version DESC) AS rank 
     FROM user_versions) uv 
WHERE uv.rank = 1 
関連する問題