【问题标题】:SQL get LAST record for each ID after some DateSQL 在某个日期之后获取每个 ID 的 LAST 记录
【发布时间】:2013-05-09 14:30:30
【问题描述】:

我需要帮助创建一个 SQL 语句,以便在某个日期之后为 USER_LOG 表中的每个 USERID 检索 LAST 记录。

我忘了写这个表还有几列。

TABLE: USER_LOG

ID 名称 MODIFY_DATE MODIFY_TYPE 55 用户A 2013-05-07 15:47:53.0 1 88 用户B 2013-05-07 16:00:57.0 1 55 用户A 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 用户A 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 用户A 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 用户A 2013-05-07 15:47:53.0 1 88 用户B 2013-05-07 16:00:57.0 1 55 用户A 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 用户A 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 用户A 2013-05-13 15:53:04.0 2 **55 用户A 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 用户A 2013-05-07 15:47:53.0 1 88 用户B 2013-05-07 16:00:57.0 1 55 用户A 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 用户A 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 用户A 2013-05-13 15:53:04.0 2 **55 用户A 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;

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 很抱歉,但是在写了太多文字之后我仍然找不到真正的问题......在你的问题中,我必须说你的问题根本不清楚

标签: sql oracle distinct


【解决方案1】:

好吧,analytical functions 本身就是为了这些目的而发明的。

你在这里:

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

【讨论】:

    【解决方案2】:

    如果您想要某个日期之后的最短日期,按用户数据分组,您应该这样做:

    SELECT ID, NAME, MIN(MODIFY_DATE) FROM user_log
    WHERE MODIFY_DATE > ?
    GROUP BY ID, NAME
    

    【讨论】:

      【解决方案3】:

      以下查询将为您提供每个用户在某个日期 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-05-12之后的所有记录。在这些记录中,它为每个用户选择最后一个(最大) modify_Date。外部查询只返回整行。

      【讨论】:

        【解决方案4】:
        SELECT ID, NAME, MAX(MODIFY_DATE) FROM user_log
        WHERE MODIFY_DATE > datevalue
        GROUP BY ID, NAME
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-17
          • 2012-11-19
          • 2014-07-29
          • 1970-01-01
          • 2019-03-14
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多