2

各親の子供のグループと、各子供の日付をすべて 1 つのテーブルにまとめています。私はしたい: 親ごとに、最大日付の子を見つけます。私はまさにそれを行う声明を書きました:

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 を 1 回選択するだけでこれを実行したいとします。それは可能ですか?

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の値を返します。同点の場合(複数の子の最大値が同じ)は適用されます。childdatedateMAX

于 2013-09-06T09:56:07.990 に答える
0

元の質問を正しく読んだ場合、同じ最大日付ですべての子供をキャプチャする必要があるため。ランク演算子は、同じ日付を持つすべての子を同じランクにランク付けします。テーブルを少し変更して、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 に答える