2012-09-03 31 views
1

我有点问题。我需要从我们的数据库中的userID中选择一个状态。问题是,每个用户ID都有多行,并有不同的日期戳。在数据库中保留历史记录。为用户获取最新的行

我试着用UserID组,但它会给我多行,在一些用户上,而不是只有最新的行,这是我想要的。

这是我的查询:

select status, userid from EmployeeTable 
where UserId in ('nis','rele') 
and asofdate in 
(select max(asofdate) from 
EmployeeTable 
where userid in ('nis','rele') 
group by userid 
) 

所以EmployeeTable中有AsOfDate列,这基本上是更新的最新版本。所以我只希望具有最高AsOfDate的行针对特定的UserID。 我在做什么错? 我猜测它必须与我一起使用in子句。我放在那里的userid越多,userid的会输出多行,但我需要能够一次选择多个用户,以获得更好的性能。

回答

4

你在做什么错的是你正在检查特定的用户和具体日期,但每个用户及其相应的日期之间没有任何联系。如果用户的记录与另一个用户的最新日期相匹配,那么您也将获得该记录。

获取用户标识及其相应的最新日期,然后再次与表进行连接以获取该记录的状态值。

select e.status, e.userid from EmployeeTable e 
inner join (
    select userid, max(asofdate) as d 
    from EmployeeTable 
    where userid in ('nis','rele') 
    group by userid 
) u on u.userid = e.userid and u.d = e.asofdate 
3

试试这个:

SELECT status,userid 
FROM EmployeeTable E 
JOIN 
    (SELECT UserId ,max(asofdate) as asofdate 
    FROM  EmployeeTable 
    WHERE userid in ('nis','rele') 
    GROUP BY UserId)a 
ON E.userid =a.userid 
AND E.asofdate=a. asofdate