3

USER_LOG テーブルの各 USERID について、ある日付の後に LAST レコードを取得するための SQL ステートメントを作成するのに助けが必要です。

このテーブルには他にいくつかの列があることを書き忘れていました。

TABLE: USER_LOG

ID 名前 MODIFY_DATE MODIFY_TYPE
55 ユーザー 2013-05-07 15:47:53.0 1
88 ユーザー B 2013-05-07 16:00:57.0 1
55 ユーザー 2013-05-08 11:44:10.0 2
88 ユーザー B 2013-05-08 15:47:09.0 2
88 ユーザー B 2013-05-08 16:01:41.0 1    
55 ユーザーA 2013-05-09 15:11:53.0 0
55 ユーザーA 2013-05-09 16:00:57.0 0
55 ユーザーA 2013-05-10 09:14:10.0 1
88 ユーザー B 2013-05-10 16:01:41.0 2
55 ユーザー 2013-05-10 18:23:03.0 2
55 ユーザーA 2013-05-11 09:14:10.0 2
88 ユーザー B 2013-05-11 16:01:41.0 1
55 ユーザーA 2013-05-13 11:34:07.0 1
55 ユーザー 2013-05-13 15:53:04.0 2
55 ユーザーA 2013-05-13 16:13:04.0 1
Example 1: Get All users they have bean changed after '2013-05-08 00:00:00.0'.
Must return:
ID 名前 MODIFY_DATE MODIFY_TYPE
55 ユーザー 2013-05-07 15:47:53.0 1
88 ユーザー B 2013-05-07 16:00:57.0 1
55 ユーザー 2013-05-08 11:44:10.0 2
88 ユーザー B 2013-05-08 15:47:09.0 2
88 ユーザー B 2013-05-08 16:01:41.0 1    
55 ユーザーA 2013-05-09 15:11:53.0 0
55 ユーザーA 2013-05-09 16:00:57.0 0
55 ユーザーA 2013-05-10 09:14:10.0 1
88 ユーザー B 2013-05-10 16:01:41.0 2
55 ユーザー 2013-05-10 18:23:03.0 2
55 ユーザーA 2013-05-11 09:14:10.0 2
**88 userB 2013-05-11 16:01:41.0 1** これを返す
55 ユーザーA 2013-05-13 11:34:07.0 1
55 ユーザー 2013-05-13 15:53:04.0 2
**55 userA 2013-05-13 16:13:04.0 1** これを返す
Example 2: Get All users they have bean changed after '2013-05-12 00:00:00.0'.
Must return:
ID 名前 MODIFY_DATE MODIFY_TYPE
55 ユーザー 2013-05-07 15:47:53.0 1
88 ユーザー B 2013-05-07 16:00:57.0 1
55 ユーザー 2013-05-08 11:44:10.0 2
88 ユーザー B 2013-05-08 15:47:09.0 2
88 ユーザー B 2013-05-08 16:01:41.0 1    
55 ユーザーA 2013-05-09 15:11:53.0 0
55 ユーザーA 2013-05-09 16:00:57.0 0
55 ユーザーA 2013-05-10 09:14:10.0 1
88 ユーザー B 2013-05-10 16:01:41.0 2
55 ユーザー 2013-05-10 18:23:03.0 2
55 ユーザーA 2013-05-11 09:14:10.0 2
88 ユーザー B 2013-05-11 16:01:41.0 1  
55 ユーザーA 2013-05-13 11:34:07.0 1
55 ユーザー 2013-05-13 15:53:04.0 2
**55 userA 2013-05-13 16:13:04.0 1** これを返す

何かを見つけましたが、X の後の日付で条件をどこに置くかわかりません。

SELECT u1.* FROM user_log u1 LEFT JOIN user_log u2 ON (u1.id = u2.id AND u1.modify_date < u2.modify_date ) WHERE u2.modify_date IS NULL;

誰かがこれで私を助けてくれますか?

4

4 に答える 4

5

まあ、これらの目的のために、分析関数自体が発明されました。

はい、どうぞ:

SELECT DISTINCT
  ID,
  NAME, 
  LAST_VALUE(MODIFY_DATE) OVER (PARTITION BY ID ORDER BY MODIFY_DATE ROWS BETWEEN unbounded preceding and unbounded following) MODIFY_DATE
FROM
  USER_LOG
WHERE
  MODIFY_DATE > :date
于 2013-05-15T06:24:25.700 に答える
1

次のクエリは、ある日付 X の後のユーザーごとの最後のレコードを提供します。

select * 
  from user_log
 where (id, modify_date) in(
         select id, max(modify_date)
           from user_log
          where modify_date > date '2013-05-12'
          group by id);

サブクエリは、2013 年 5 月 12 日以降のすべてのレコードを選択します。これらのレコードから、各ユーザーの最後の (最大) 変更日を選択します。外側のクエリは行全体を返すだけです。

于 2013-05-15T07:11:09.193 に答える
0
SELECT ID, NAME, MAX(MODIFY_DATE) FROM user_log
WHERE MODIFY_DATE > datevalue
GROUP BY ID, NAME
于 2013-05-15T06:20:00.770 に答える