我有一个users
表,其中包含人员及其状态。 ID字段不是唯一的。
ID | Name | Status
1 | Jon | Online
2 | Ken | Away
3 | Kim | Online
4 | Van | Offline
1 | Jon | NULL
2 | Ken | NULL
3 | Kim | NULL
4 | Van | NULL
1 | Jon | Online
在这种情况下,我想让在线的用户和此表中用户的所有其他相同ID形成这样的形式。
ID | Name | Status
1 | Jon | Online
1 | Jon | Online
1 | Jon | NULL
3 | Kim | Online
3 | Kim | NULL
有没有办法用一个select语句来获得这个结果?
答案 0 :(得分:2)
如果没有登录时间戳,它不会向您提供有关您希望如何为某人获取最新活动的详细信息。如果他们可以有3行,你怎么知道哪一个意味着他们在线,哪一个意味着他们在线。
http://sqlfiddle.com/#!6/3833e/4<<< MS SQL安装程序
http://sqlfiddle.com/#!4/f190f/2<<< Oracle SQL安装程序
Fiddle以按人员分组的最近登录的降序为您提供给人。如果您只想获取最新的登录信息,请使用SQL端的第二个选择。
SELECT t1.ID
, t1.Name
, t1.Status
, t1.OnlineTimeStamp
, ROW_NUMBER() OVER ( PARTITION BY t1.ID ORDER BY t1.OnlineTimeStamp DESC ) AS rn
FROM Test_Client t1
WHERE EXISTS ( SELECT 1 FROM Test_Client t2 WHERE t2.ID = t1.ID AND t2.Status = 'Online' )
ORDER BY t1.ID, rn
;
SELECT tcSub.ID
, tcSub.Name
, tcSub.Status
FROM (
SELECT t1.ID
, t1.Name
, t1.Status
, t1.OnlineTimeStamp
, ROW_NUMBER() OVER ( PARTITION BY t1.ID ORDER BY t1.OnlineTimeStamp DESC ) AS rn
FROM Test_Client t1
WHERE EXISTS ( SELECT 1 FROM Test_Client t2 WHERE t2.ID = t1.ID AND t2.Status = 'Online' )
) tcSub
WHERE tcSub.rn = 1
ORDER BY tcSub.ID
答案 1 :(得分:1)
有几种方法可以做到这一点 - 一种是使用exists
:
select id, name, status
from users u
where exists (
select 1
from users u2
where u.id = u2.id and u2.status = 'Online'
)
这是使用in
的版本(虽然我更喜欢先前的版本):
select id, name, status
from users
where id in (
select id
from users
where status = 'Online'
)