我需要根据同一个表中列的值选择记录。

时间:2016-05-10 16:40:59

标签: sql

我有一个名为user_versions的表。由于要求,此表没有任何标识列。如果用户更新了他们的详细信息,则会创建一个新版本,名为version的列会增加1而另一个版本不再存在,但会再次保留,这是由于需求和新版本上线。

**My Problem**  
Simple example

user_versions
------------
user_id|name|email|version
1|John|john@example.com|1
1|John|john@example.com|2
1|John|john@example.com|3
1|John|john@example.com|4
2|Peter|peter@example.com|1
2|Peter|peter@example.com|2
2|Peter|peter@example.com|3

Needed Results!!!
------------
1|John|john@example.com|4
2|Peter|peter@example.com|3

如果我想返回最新版本的每一个我怎么能这样做?我已经尝试了很多东西而无法解决这个问题。我能够通过两个单独的查询来完成,但如果我能在一个查询中返回所需的内容,我将非常感激。

任何帮助都会非常感谢。

4 个答案:

答案 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

答案 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

答案 2 :(得分:0)

保持简单

SELECT user_id,name,email,max(version)

FROM user_versions.tt
group by user_id,name,email

答案 3 :(得分: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