我发现了一些我自己无法解决的问题。缺乏解决问题的技巧...... :(
我需要获得结果以选择具有其ID的每个用户,并显示他们的上次登录信息, 例如,从这张表:
id name loginTime logoutTime
3 test 2013-11-25 22:50:00 null
4 test1 2013-11-20 07:23:18 null
6 test2 2013-11-19 11:17:22 null
3 test3 2013-11-27 14:20:54 null
16 test4 2013-11-09 13:52:21 null
3 test 2013-12-02 23:07:43 null
2 test5 2013-11-11 18:15:31 null
4 test1 2013-11-17 19:13:59 null
6 test2 2013-11-30 03:10:07 null
...
我需要得到:
id name loginTime logoutTime
2 test5 2013-11-11 18:15:31 null
3 test 2013-12-02 23:07:43 null
4 test1 2013-11-20 07:23:18 null
6 test2 2013-11-30 03:10:07 null
16 test4 2013-11-09 13:52:21 null
...
到目前为止,我已经使用DISTINCT来区分用户,但是每个不同用户的最后登录日期都存在问题...
实现这一目标的最佳方法是什么?
答案 0 :(得分:3)
select max(loginTime), id, name
from your_table
group by id, name
答案 1 :(得分:0)
SELECT id, name, logintime, logouttime a from table where logintime=(select max(logintime) from table b where a.id = b.id)
答案 2 :(得分:0)
在CTE中使用row_number()
对它们进行排序,然后过滤选择中的最新内容:
declare @log table (id int, name varchar(10), loginTime datetime, logoutTime datetime);
insert into @log
select 3, 'test', '2013-11-25 22:50:00', null union all
select 4, 'test1', '2013-11-20 07:23:18', null union all
select 6, 'test2', '2013-11-19 11:17:22', null union all
select 3, 'test3', '2013-11-27 14:20:54', null union all
select 16, 'test4', '2013-11-09 13:52:21', null union all
select 3, 'test', '2013-12-02 23:07:43', null union all
select 2, 'test5', '2013-11-11 18:15:31', null union all
select 4, 'test1', '2013-11-17 19:13:59', null union all
select 6, 'test2', '2013-11-30 03:10:07', null
;with yak as
( select [r]=row_number()over(partition by name order by loginTime desc), *
from @log
)
select *
from yak
where r = 1;
您也可以像其他答案中提到的那样MAX(LoginDate)
。