【问题标题】:get the latest record from the table for each user [duplicate]从表中获取每个用户的最新记录[重复]
【发布时间】:2017-08-20 23:24:06
【问题描述】:

我有一个 user_status 表,它存储每个用户的状态,每次状态更改时,我都会在 user_status 表中添加状态。

id   status     created 
1    ACTIVE     08-10-2017 08:21:22
1    ACTIVE     08-10-2017 08:21:25
1    NON_ACTIVE 08-10-2017 08:22:23
2    NON_ACTIVE 08-10-2017 08:22:23
2    ACTIVE     08-11-2017 08:25:23
3    NON_ACTIVE 08-12-2017 08:23:23

我要查找的是基于创建日期的每个用户的最后状态 所以我正在寻找的输出是

id   status     created 
1    NON_ACTIVE 08-10-2017 08:22:23
2    ACTIVE     08-11-2017 08:25:23
3    NON_ACTIVE 08-12-2017 08:23:23

一旦我这样做了,我也很想知道是否有办法为每个用户获取倒数第二个状态(最后一个)状态

所以我正在寻找的这个查询的输出是

1    ACTIVE     08-10-2017 08:21:25
2    NON_ACTIVE 08-10-2017 08:22:23
3    NON_ACTIVE 08-12-2017 08:23:23

任何建议,我

【问题讨论】:

    标签: sql oracle oracle11g greatest-n-per-group


    【解决方案1】:

    拯救窗口函数!

    select t.*
    from (select t.*,
                 row_number() over (partition by id order by created desc) as seqnum,
                 nth_value(status, 2) over (partition by id order by created desc) as second_status
          from t
         ) t
    where seqnum = 1;
    

    如果不想要所有列,可以使用条件聚合:

    select t.id, max(t.created) as created,
           max(case when seqnum = 1 then status end) as last_status,
           max(case when seqnum = 2 then status end) as second_status,
    from (select t.*,
                 row_number() over (partition by id order by created desc) as seqnum
          from t
         ) t
    group by id;
    

    【讨论】:

    • 有什么理由匿名否决看似正确的答案?
    • 我不确定是谁投了反对票,我仍在调查您的问题。我不确定谁投了反对票
    • @user641887 。 . .它看起来像一个恶意的投反对票者,他只是对问题和所有答案投了反对票。
    • @GordonLinoff 给了你一票;)
    【解决方案2】:

    查看您的查询,我建议一次性获取详细信息,而不是获取第一个状态然后再进行第二个状态。希望下面的 sn-p 有所帮助。

    SELECT B.ID,
      B.STATUS,
      B.CREATED
    FROM
      (SELECT A.ID,
        A.STATUS,
        CREATED,
        ROW_NUMBER() OVER(PARTITION BY A.ID ORDER BY A.CREATED DESC) RN
      FROM
        (SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:22' CREATED FROM DUAL
        UNION ALL
        SELECT 1 ID,'ACTIVE' STATUS,'08-10-2017 08:21:25' CREATED FROM DUAL
        UNION ALL
        SELECT 1 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL
        UNION ALL
        SELECT 2 ID,'NON_ACTIVE' STATUS,'08-10-2017 08:22:23' CREATED FROM DUAL
        UNION ALL
        SELECT 2 ID,'ACTIVE' STATUS,'08-11-2017 08:25:23' CREATED FROM DUAL
        UNION ALL
        SELECT 3 ID,'NON_ACTIVE' STATUS,'08-12-2017 08:23:23' CREATED FROM DUAL
        )A
      )B
    WHERE B.RN IN (1,2);
    /
    

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多