3

我对 Oracle 很陌生,最近遇到了一个问题:

我有一个包含以下列的表:person_id、account_login、add_date。

person_id | account_login | add_date
----------|---------------|------------
1         | user1         | 2012-07-10
1         | user2         | 2012-07-09
2         | user3         | 2012-07-05
2         | user4         | 2012-07-04

一个人可以有多个 account_logins。对于每个人,我想获取最旧的 account_login :

person_id | account_login | add_date
----------|---------------|------------
1         | user2         | 2012-07-09
2         | user4         | 2012-07-04

所以我所做的是:

select
  person_id,
  MAX(account_login) KEEP (DENSE_RANK FIRST ORDER BY add_date)
from
  table
group by
  person_id;

我得到了我想要的结果,但我认为我的查询语法远非良好。Oracle 强迫我使用聚合函数,我使用 MAX() 或 MIN() 知道它完全没有意义。

有没有办法比这更好地编写查询?(甲骨文 11g)

4

2 回答 2

2

您可以单独使用 DENSE_RANK 作为分析,并从结果查询中进行选择:

SELECT person_id, account_login, add_date
  FROM (SELECT table.*
             , DENSE_RANK() OVER (PARTITION BY person_id ORDER BY add_date) rnk
         FROM table)
 WHERE rnk = 1;

不确定您认为哪个版本更优雅。如果您在同一日期为特定的 person_id 创建了两个帐户,它也没有说明该怎么做。如果您的 add_date 中也有时间组件,那么您应该没问题。如果可能出现平局,也许 ROW_NUMBER() 会给你一个更理想的结果。

于 2012-07-13T21:09:37.937 回答
0

您可以像这样加入表格和嵌套视图

select person_id,account_login,add_date
from tab inner join 
(select person_id,min(add_date) add_date 
from tab group by person_id) 
using(person_id,add_date)

顺便说一句,我真的不认为这很清楚。

于 2012-07-14T01:06:52.450 回答