2

我为每个父母有一组孩子,每个孩子都有一个日期,都在一张桌子上。我想:对于每个父母,找到最大日期的孩子。我写了一个声明就是这样做的:

create table t(
  parent string,
  child string,
  date date,
);

主键:(父,子)

select a.*
from
    (select parent, child, date from t) a
  join
    (select parent, max(date) as lastdate from t group by parent) b
  on
    a.parent = b.parent
    and a.date = b.lastdate

现在的问题是,我在表 t 上做了 2 次单独的选择。假设表 t很大,我想只在表 t 上进行一次选择。那可能吗?

我在 Oracle 10g EE 上使用 Oracle SQl Developer。

4

2 回答 2

4

您可以使用聚合函数FIRST

SELECT parent, 
       MAX(child) KEEP (DENSE_RANK FIRST ORDER BY date DESC) lastchild, 
       MAX(date) lastdate 
  FROM t
 GROUP BY parent

lastchild列将返回具有此父项child最大值的行的值。date在平局的情况下(几个孩子有相同的 max date),MAX将被应用。

于 2013-09-06T09:56:07.990 回答
0

如果我正确阅读了您的原始问题,您需要捕获所有具有相同最大日期的孩子。rank 运算符将对所有具有相同日期的孩子进行排名。我稍微更改了您的表格,以便它可以正常工作并且不会与 Oracle 关键字冲突。

    create table t(
  parent varchar2(20),
  child varchar2(20),
  child_date date
);

insert into t (parent, child, child_date) values (1,'A',sysdate-1);
insert into t (parent, child, child_date) values (1,'B',sysdate+45);

insert into t (parent, child, child_date) values (2,'A',sysdate+45);
insert into t (parent, child, child_date) values (2,'B',sysdate+45);

select parent, child from (
    select parent, child, rank() over (partition by parent order by child_date desc) rnk
    from t)
    where rnk = 1;
于 2013-09-06T14:14:00.393 回答