行组中的Oracle组和获取最新时间戳的行

时间:2014-12-19 10:14:20

标签: sql oracle select group-by greatest-n-per-group

我有一个选择给我这个结果:

 - ID   | System    | Type1 | NID       | Name_ | Type2__   | Date 
 - 24   | AA-Tool   | PRIV  | 816       | Name1 | IMPLICIT  | 17.12.2014
 - 24   | AA-Tool   | PRIV  | 816       | Name1 | EXPLICIT  | 19.12.2014
 - 24   | AA-Tool   | PRIV  | 816       | Name1 | EXPLICIT  | 20.12.2014
 - 25   | BB-Tool   | PRIV  | 817       | Name2 | EXPLICIT  | 20.12.2014
 - 25   | BB-Tool   | PRIV  | 817       | Name2 | EXPLICIT  | 21.12.2014

因此,ID,System,Type1,NID和Name应该是不同的,Type2和Date应该是按日期的最后一个条目。 这应该是结果:

 - 24   | AA-Tool   | PRIV  | 816       | Name1 | EXPLICIT  | 20.12.2014
 - 25   | BB-Tool   | PRIV  | 817       | Name2 | EXPLICIT  | 21.12.2014

我希望这是可以理解的:)

谢谢, 迈克尔

3 个答案:

答案 0 :(得分:3)

另一种方法可能是:

SELECT t.*
  FROM(SELECT t.*,
              ROW_NUMBER() OVER (PARTITION BY id, system, type1, nid, name 
                                     ORDER BY date DESC) AS rn
         FROM tabelA t
      )
 WHERE rn = 1

也许它会帮助你。

答案 1 :(得分:1)

试试这个:

SELECT a.ID, a.System, a.Type1, a.NID, a.Name_, a.Type2__, a.Date
FROM tableA a 
INNER JOIN (SELECT a.ID, a.System, a.Type1, a.NID, a.Name_, MAX(a.Date) Date 
            FROM tableA a
            GROUP BY a.ID, a.System, a.Type1, a.NID, a.Name_
           ) b ON a.ID = b.ID AND a.System = b.System AND 
                  a.Type1 = b.Type1 AND a.NID = b.NID AND 
                  a.Name_ = b.Name_ AND a.Date = b.Date;

答案 2 :(得分:1)

SELECT   DISTINCT *
FROM    (   SELECT   id,
                     system,
                     type_id,
                     nid,
                     name_,
                     type2__,
                     date,
                     RANK() OVER (PARTITION BY id, system, type1, nid ORDER BY date DESC) AS reverse_date_rank
            FROM     sometable )
WHERE    reverse_date_rank = 1;

只有在特定日期可以获得多个相同的name_ / type2__条目时才需要外部子查询中的DISTINCT,因为它们将返回相等的reverse_date_rank。