2013-01-14 27 views
1

我有如下的表结构。我想根据office_id和最新的login_datetime选择不同的user_id。从子查询中选择不同顺序的列

tbl_id  user_id  office_id login_datetime 
---------------------------------------- 
1   2   28   12/28/2012 5:35:50 AM 
2   2   15   12/28/2012 5:35:50 AM 
3   3   20   12/28/2012 5:35:50 AM 
4   4   28   12/28/2012 5:35:50 AM 
5   2   28   12/28/2012 5:35:50 AM 
6   4   15   12/28/2012 5:35:50 AM 
7   3   20   12/28/2012 5:35:50 AM 

我想这样的:

SELECT user_id as u_id,office_id, 
(select login_datetime from tbl t2 where t2.user_id=u_id AND ROWNUM=1 ORDER BY t2.tbl_id DESC) as LAST_LOGIN 
FROM tbl 
GROUP BY user_id,office_id 

但是,它不是为我工作,任何帮助吗?

回答

2

另一个sollution是直接group by用的USER_ID和office_id分组keep dense rank

select user_id, office_id, 
max(login_datetime) keep (dense_rank first order by login_datetime desc) as latest_login_datetime 
from tbl 
group by user_id, office_id 

,或者如果你想要独一无二的user_id:

select user_id, 
max(office_id) keep (dense_rank first order by login_datetime desc) as lastest_office_id, 
max(login_datetime) keep (dense_rank first order by login_datetime desc) as latest_login_datetime 
from tbl 
group by user_id 
3

使用Window Function

SELECT tbl_id, user_id, office_id,login_datetime 
FROM  
    (
     SELECT tbl_id, user_id, office_id,login_datetime, 
       ROW_NUMBER() OVER (PARTITION BY user_id, "office_id" 
            ORDER BY login_datetime DESC) rn 
     FROM tableName 
    ) a 
WHERE a.rn = 1 
0

OK,我已经改变了例如ORACLE

我会解释查询

首先我正在选择不同user_id和办公室id(so如果用户属于两个办公室,他将返回两次) ,然后MAX login_datetime获取最新日期时间,

然后在WHERE中,我通过office_id筛选查询,它与所有不同的办公室相同。 (基本上我返回office_id的不同表)

在最后,我感到因为MAX函数

SELECT 
DISTINCT "user_id" , 
"office_id", 
MAX("login_datetime") 
FROM TableName 
WHERE "office_id" IN (SELECT DISTINCT "office_id" FROM TableName) 
GROUP BY 
    "user_id", 
    "office_id" 

SQL Fiddle example

+0

问题在于Oracle。 –

+0

我不明白'WHERE office_id IN(SELECT DISTINCT office_id FROM @tbl)'Office_id已经在tbl中。 –

+0

我已经改变我的查询到ORACLE并添加了一些解释...希望它会帮助 – Silagy