2016-05-10 5 views
0

Ich habe eine Tabelle namens user_versions. Diese Tabelle enthält aufgrund der Anforderungen keine Identitätsspalte. Wenn ein Benutzer seine Details aktualisiert, wird eine neue Version erstellt, eine Spalte mit der Bezeichnung Version wird um 1 erhöht und die andere Version ist nicht mehr aktiv, wird aber aufgrund der Anforderungen beibehalten und die neue Version wird live geschaltet.Ich muss Datensätze basierend auf dem Wert einer Spalte in der gleichen Tabelle auswählen.

**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 

Wenn ich die neueste Version von jedem zurückgeben wollte, wie könnte ich das tun? Ich habe viele Sachen ausprobiert und kann es nicht herausfinden. Ich bin in der Lage, dies mit zwei getrennten Abfragen zu tun, aber ich würde es sehr schätzen, wenn ich die benötigte in einer Abfrage zurückgeben könnte.

Jede Hilfe wäre super, danke.

Antwort

1

Mit Standard-Syntax wäre es:

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

Viele finden Sie diese einfach und großartig zu folgen. –

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

keep it simple

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 
Verwandte Themen