获得每组结果的最大元素

时间:2012-10-22 14:24:23

标签: sql oracle

我有以下字段:user_id, app_mod, profile, update_date。 前三个字段可以重复(即两行可以user_id, app_mod and profile等于,但不同update_date):

user_id   app_mod  profile update_date
560047    RI03290   22809   14-GEN-10  
560047    RI03290   22809   18-GEN-10

如何在Oracle环境中获得更高update_date的一行?

560047    RI03290     22809   18-GEN-10

1 个答案:

答案 0 :(得分:2)

如果表格实际上只有4列

SELECT user_id, app_mod, profile, max(update_date)
  FROM table_name
 GROUP BY user_id, app_mod, profile

如果表中还有其他列,那么您不会包含并且不会重复,那么您确实需要返回

SELECT *
  FROM (SELECT a.*,
               rank() over (partition by user_id, app_mod, profile
                                order by update_date desc) rnk
          FROM table_name a)
 WHERE rnk = 1;

如果存在关联,分析函数rank将为多个行分配相同的排名(即两行具有相同的user_idapp_modprofile和{ {1}})。您可以使用update_date而不是任意打破平局。但这通常不是一个可重复的过程 - 甲骨文可能会选择今天的两行中的一行,明天另一行。如果您要查找的是最近一行以外的行,您可能还会查看row_number,但如果您只是在查找最近的行,则其行为与dense_rank相同。