我有以下字段: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
答案 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_id
,app_mod
,profile
和{ {1}})。您可以使用update_date
而不是任意打破平局。但这通常不是一个可重复的过程 - 甲骨文可能会选择今天的两行中的一行,明天另一行。如果您要查找的是最近一行以外的行,您可能还会查看row_number
,但如果您只是在查找最近的行,则其行为与dense_rank
相同。