1

次のテーブル構造があります。最新のlogin_datetimeでoffice_idに従って個別の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

しかし、それは私にとってはうまくいきません。

4

3 に答える 3

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
于 2013-01-14T06:25:26.620 に答える
2

group by別の解決策は、次のものを使用した直接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
于 2013-01-14T06:45:03.497 に答える
0

OK、例をORACLEに変更しました

クエリについて説明します

最初に、個別のuser_idとoffice idを選択し(ユーザーが2つのオフィスに属している場合、2回戻ります)、次にMAX login_datetimeを選択して、最新の日時を取得します。

次に、WHEREで、すべての個別のオフィスに相当するoffice_idでクエリをフィルタリングしています。(基本的に、office_idの個別のテーブルを返します)

結局、MAX関数のためにuser_idとoffice_idでグループ化しています

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フィドルの例

于 2013-01-14T06:31:05.040 に答える