INNER JOIN改变状态

时间:2015-10-23 10:34:31

标签: sql oracle11g

我有一个包含3列的表USERS user_id,user_status和usr_update。 最后一列说明了上次状态更改的日期和时间,我希望获得用户状态的最后一次更改。 我试试这个但是不起作用。

SELECT user_id, user_status, max(usr_update)
FROM USERS u1 INNER JOIN USERS u2
    ON u1.user_id=u2.user_id
WHERE u1.user_id='123456' AND
    u1.user_status<>u2.user_status

任何人都可以提供帮助吗?

@jarlh 没关系,但是如果我有更多相同状态的连续记录怎么办?我想用新状态获得第一记录? 例如

我想获得记录(id_15,阻止,2015年10月17日)

2 个答案:

答案 0 :(得分:1)

SELECT user_id, user_status, usr_update
FROM USERS u1
WHERE NOT EXISTS (select 1 from users u2
                  where u1.user_id=u2.user_id
                    and u2.usr_update > u1.usr_update)

即。如果同一用户没有后续行,则返回一行。

答案 1 :(得分:0)

如果您只关心一个用户,请使用order by并仅获取一行:

SELECT u.*
FROM (SELECT u.*
      FROM users u
      WHERE u.user_id = '123456' 
      ORDER BY u.usr_update DESC
     ) u
WHERE rownum = 1;

(注意:在Oracle 12+中,您可以使用FETCH FIRST 1 ROW ONLY,因此不需要子查询。)

您也可以使用keep

执行此操作
SELECT u.user_id, MAX(u.usr_update),
       MAX(user_status) KEEP (DENSE_RANK FIRST OVER ORDER BY u.usr_update DESC) as last_user_status
FROM users u
WHERE u.user_id = '123456' 
GROUP BY u.user_id;

此方法在没有WHERE子句的情况下可以正常工作。而且,根据我的经验,KEEP表现得非常好。