代码之家  ›  专栏  ›  技术社区  ›  Johnny Banana

Oracle SQL-为每个用户选择最大行[重复]

  •  -2
  • Johnny Banana  · 技术社区  · 7 年前

    我有一张这样的桌子:

    PROFILE_ID X_START_DATE X_END_DATE   FORMER_EMPLOYER    NEW_EMPLOYER  START_DATE
    1          2015-07-20   2016-07-20   GOOGLE             BURGER KING   2017-01-01
    1          2003-10-25   2009-01-14   FACEBOOK           BURGER KING   2017-01-01
    2          2007-10-04   2008-05-05   MICHAELS           KFC           2017-01-01
    2          2008-05-06   2009-05-05   GOOGLE             KFC           2017-01-01
    2          2009-05-06   2010-05-05   FACEBOOK           KFC           2017-01-01
    3          2007-10-04   2008-05-05   MCDONALDS          BURGER KING   2017-01-01
    

    我想要的:

    对于每个PROFILE\u ID,我需要包含最新X\u END\u日期的行。 对于PROFILE_ID 1,我需要第1行,依此类推。

    当我这样做时:

    Select profile_id, max(end_date)
    group by 1;
    

    我实际上得到了我想要的,但不是我需要的所有列。通过获取更多列,我需要在我的“groupby”语句中使用它们,这不是我想要的。

    谢谢

    3 回复  |  直到 7 年前
        1
  •  1
  •   Srini V    7 年前

    使用的另一种方式 IN 和子查询

    select * 
    from yourtable 
    where (profile_id, end_date) IN
    (Select profile_id, max(end_date) as end_date
    from yourtable
    group by profile_id);
    

    如果你喜欢加入

    select a.* 
    from yourtable a 
    INNER JOIN (Select profile_id, max(end_date) as end_date
                from yourtable
                group by profile_id) b 
    ON a.profile_id = b.profile_id and a.end_date b.end_date;
    
        2
  •  0
  •   Caius Jard    7 年前

    在oracle中,使用所谓的分析函数最容易做到这一点:

      SELECT * FROM
      (
       SELECT
        t.*,
        ROW_NUMBER() OVER(PARTITION BY t.profile_id ORDER BY t.end_date DESC) as rown
       FROM
        yourtable t
      ) a
      WHERE rown = 1
    

    其工作方式是,row\u number函数为分区中的行块分配递增的数字-同一分区(相同的配置文件id)中的所有行都被视为编号。行的顺序由end\u date降序(最近的第一个)指定。这样我们知道,对于每个不同的profile\u id值,具有最近end\u date的总是用1编号。然后我们只需选择这些值

        3
  •  0
  •   Deepesh kumar Gupta    7 年前

    如果使用group by,则必须在所有其他列上指定聚合函数,以确保要填充的数据是哪一行。

    请记住,分组依据将为应用列提供单个记录。

    Select profile_id, max(end_date), 
    max(X_END_DATE),   
    max(FORMER_EMPLOYER),    
    max(NEW_EMPLOYER), 
    max(START_DATE)
    group by profile_id;
    

    无需在组中添加所有不必要的列,只需在其上添加聚合函数即可。