我有一个包含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日)
答案 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
表现得非常好。